2010-10-03 5 views
11

En Rails 3, puede pasar atributos directamente a redirect_to para configurar el flash. Por ejemplo:Cómo permitir teclas flash personalizadas en una redirección_para llamar a Rails 3

redirect_to root_path, :notice => "Something was successful!" 

Sin embargo, esto sólo funciona con las teclas :alert y :notice; Si desea utilizar teclas personalizadas, usted tiene que utilizar una versión más detallada:

redirect_to root_path, :flash => { :error => "Something was successful!" } 

¿Hay alguna manera de hacerlo de modo que las claves personalizadas (como :error, arriba) se pueden pasar a redirect_to sin especificar que en :flash => {}?

Respuesta

25

En Rails 4 se puede hacer esto

class ApplicationController < ActionController::Base 
    add_flash_types :error, ... 

y luego en algún lugar

redirect_to root_path, error: 'Some error' 

http://blog.remarkablelabs.com/2012/12/register-your-own-flash-types-rails-4-countdown-to-2013

+0

impresionante! Marcar esto como la respuesta aceptada, ya que debería usarse en el futuro. –

+0

me encuentro con un problema donde llamé a un tipo de flash: inicio de sesión pero también tengo un método de inicio de sesión de ayuda de la "gema de brujería". tal vez agregar tipos de flash con eso no es tan bueno en este momento? – dtc

+0

Hablando sobre el rendimiento o la forma correcta de lograr el mismo comportamiento, ¿cuál es la mejor manera de hacerlo? ** 1.- Agregar nuevos tipos de flash ** como con 'add_flash_types: error, ...' o ** 2.- Agregar nuevos hashes en el objeto Flash ** como con ': flash => {: error =>" ¡Oh, no! " } '? –

8

He utilizado el siguiente código, colocado en lib/core_ext/rails/action_controller/flash.rb y se carga a través de un inicializador (que es una reescritura del código rieles incorporado):

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 

Puede, por supuesto, añadir más claves, además de sólo :error ; verifique el código en http://github.com/rails/rails/blob/ead93c/actionpack/lib/action_controller/metal/flash.rb para ver cómo se veía originalmente la función.

Cuestiones relacionadas