Как разрешить использование пользовательских флеш-ключей в вызове redirect_to в Rails 3 - PullRequest
14 голосов
/ 03 октября 2010

В 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 => {}?

Ответы [ 2 ]

28 голосов
/ 05 сентября 2013

В 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

8 голосов
/ 03 октября 2010

Я использовал следующий код, помещенный в 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, чтобы увидеть, как изначально выглядела функция.

...