Как разрешить настраиваемые флеш-ключи при вызове redirect_to в Rails 3
В Rails 3 вы можете передать атрибуты непосредственно в redirect_to
для установки вспышки. Например:
redirect_to root_path, :notice => "Something was successful!"
Однако это работает только с клавишами :alert
и :notice
; если вы хотите использовать пользовательские ключи, вам нужно использовать более подробную версию:
redirect_to root_path, :flash => { :error => "Something was successful!" }
Есть ли способ сделать это так, чтобы пользовательские клавиши (например, :error
, выше) могли быть переданы в redirect_to
без указания его в :flash => {}
?
Ответы
Ответ 1
В Rails 4 вы можете сделать это
class ApplicationController < ActionController::Base
add_flash_types :error, ...
а затем где-нибудь
redirect_to root_path, error: 'Some error'
http://blog.remarkablelabs.com/2012/12/register-your-own-flash-types-rails-4-countdown-to-2013
Ответ 2
Я использовал следующий код, помещенный в lib/core_ext/rails/action_controller/flash.rb
и загруженный через инициализатор (он переписывает встроенный код Rails):
module ActionController
module Flash
extend ActiveSupport::Concern
included do
delegate :alert, :notice, :error, :to => "request.flash"
helper_method :alert, :notice, :error
end
protected
def redirect_to(options = {}, response_status_and_flash = {}) #:doc:
if alert = response_status_and_flash.delete(:alert)
flash[:alert] = alert
end
if notice = response_status_and_flash.delete(:notice)
flash[:notice] = notice
end
if error = response_status_and_flash.delete(:error)
flash[:error] = error
end
if other_flashes = response_status_and_flash.delete(:flash)
flash.update(other_flashes)
end
super(options, response_status_and_flash)
end
end
end
Вы можете, конечно, добавить еще несколько клавиш, кроме :error
; проверьте код http://github.com/rails/rails/blob/ead93c/actionpack/lib/action_controller/metal/flash.rb, чтобы увидеть, как функция выглядела изначально.