¿Por qué enfoque tomar para incluir enlaces en los mensajes de flash?
-
19-09-2019 - |
Pregunta
La capacidad de tener flash los mensajes flash (aviso, error, advertencia, etc) con enlaces es bueno desde un punto de vista de la interacción del usuario.Sin embargo, la incorporación de una etiqueta de anclaje en el interior de un mensaje de flash desde el controlador está sucio.
Vamos a suponer que un mensaje flash como esto es bueno para la usabilidad*:
Ejemplo de Flash Mensaje de Aviso con un Enlace Incrustado http://img.skitch.com/20090826-xbsa4tb3sjq4fig9nmatakthx3.png (tomado de DailyMile.com)
Qué táctica tomaría entre el controlador y la vista a emplear algo como esto limpiamente?
Solución
Sólo pensé que iba a compartir esto, ya que la respuesta se encuentra que estaba buscando en otra parte:
Trabajos sobre raíles 3.1
flash[:notice] = "Proceed to #{view_context.link_to('login page', login_path)}".html_safe
Otros consejos
Glenn Gillen tiene un enfoque que él llama mensajes útiles del flash en rieles .
He modificado sus fragmentos de código a ser un poco más idiomática (al menos para mí).
El controlador llena el flash de la siguiente:
flash[:notice] = "Your profile was updated. %s"
flash[:notice_item] = ["Edit again?", edit_profile_path(@profile)]
A continuación, puede tener ayudantes que miran algo como esto:
def render_flash_messages(*keys)
messages = keys.collect do |key|
content_tag(:p, flash_message_with_item(key), :class => "flash #{key}") if flash[key]
end.join
content_tag(:div, messages, :id => "flash_messages") unless messages.blank?
end
def flash_message_with_item(key)
item = flash["#{key}_item".to_sym]
substitution = item.is_a?(Array) ? link_to(*item) : item
flash[key] % substitution
end
La vista se ve simplemente como esto:
<%= render_flash_messages(:error, :notice, :warning) %>
La vista (a través del ayudante flash_message_with_item
) es responsable de la creación de la etiqueta de anclaje, pero el controlador gestiona lo que pasa en el mensaje flash que incluye un recurso opcional para la acción futura.
Usted podría crear un método auxiliar para renderizar parciales basados en el valor pasado en el mensaje flash.
Esto es similar a () en los carriles de flash
# In your controller
flash[:error] = render_to_string(:partial => "sessions/login_failed_message")
# In sessions/_login_failed_message.html.erb
Login failed. If you have forgotten your password, you can #{link_to('reset it', reset_path)}