2009-10-16 13 views
38

Mi caso de uso básico es hacer algo de procesamiento, establecer flash[:notice], y luego redirigir a una página nueva. Por lo que puedo decir, los redireccionamientos restablecen la etiqueta flash (corrígeme si me equivoco). ¿Hay alguna manera de ganar persistencia? Usar sesiones no es una opción, y he pirateado el problema usando cookies, pero creo que debe haber una manera mejor.obtener el hash flash para persistir a través de redirecciones

+0

sí parpadea [: aviso] aparecen durante un render y no una redirección? ¿Estás seguro de que se está cargando el diseño estándar? – EmFi

Respuesta

74

El hash flash persiste para exactamente un redireccionamiento o renderizado. Entonces deberías estar bien con la configuración predeterminada.

Si necesita mantener el hash de flash para otra solicitud/redirección, puede llamar a flash.keep.

flash.keep # keep the entire flash hash around for an extra request. 
flash.keep(:notice) # keep just flash[:notice] for an extra request. 
+0

¿Hay alguna razón posible por la que esto no siempre sea cierto (como sesiones inhabilitadas)? Ciertamente no es el caso en mis usos (flash [: notice] debe mostrarse como parte del diseño estándar, pero no es visible a menos que se establezca antes que un renderizado en lugar de un redireccionamiento). –

+0

¿Qué ocurre cuando se hace referencia explícita a flash [: notice] en una vista? – EmFi

+0

Después de una redirección? Nada. Si no hay una redirección involucrada, puedo ver la misma cadena asignada. –

1

Algo a tener en cuenta por lo menos en los carriles v3.2.1 es que el flash persistirá a través de una redirección si no es que se hace referencia en absoluto a través de al menos 1 redirección y cargar el mismo punto de vista después. Se trata de un pseudo código de mi experiencia reciente:

def some_action 

(code that may set a flag to redirect 1 time) 

redirect_to action_path if(redirect_flag) 
.... 
end 

La ejecución de este daría lugar a la rápida [: mensaje] estar presente independientemente de la redirección.

def some_action 
logger.debug("Flash[:message] #{flash[:message]}") 

(code that may set a flag to redirect 1 time) 
redirect_to action_path if(redirect_flag) 
.... 
end 

durante la depuración con el registrador de referencia rápida [] que sólo aparecen cuando la redirección no sucedió. Podría ver que esto es problemático si agregaste una referencia al flash antes de redirigir y lo perdiste en la línea sin motivo aparente.

Ver rubí documentos aquí (Instance protected method: Use at the bottom)

+0

¡Ah, gracias! Agregué un poco de registro que registraba el flash en el nivel de solicitud, y estaba confundido en cuanto a por qué el flash ya no se conservaba a través de redirecciones múltiples. Parece que si quieres hacer algo como esto, puedes leer el flash a través de 'request.session ['flash']' (al menos en Rails 4) y no pasará por el acceso normal, que es lo que normalmente marca el flash como referenciado. – Ibrahim

Cuestiones relacionadas