ruby on rails - code - ¿Qué enfoque adopta para incrustar enlaces en mensajes flash?
rails gem (4)
Esto es similar a link_to () en Rails 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)}
La capacidad de tener mensajes flash (aviso, error, advertencia, etc.) con enlaces incrustados es agradable desde el punto de vista de la interacción del usuario. Sin embargo, la incrustación de una etiqueta de anclaje dentro de un mensaje flash desde el controlador está sucia.
Supongamos que un mensaje flash como este es bueno para la usabilidad *:
Ejemplo de aviso de mensaje flash con un enlace incorporado http://img.skitch.com/20090826-xbsa4tb3sjq4fig9nmatakthx3.png (tomado de DailyMile.com )
¿Qué táctica tomaría entre el controlador y la vista para emplear algo como esto limpiamente?
Podría crear un método auxiliar para representar parciales en función del valor devuelto en el mensaje flash.
Glenn Gillen tiene un enfoque que él llama mensajes flash útiles en Rails .
Modifiqué sus fragmentos de código para que fuera un poco más idiomático (al menos para mí).
El controlador llena el flash de esta manera:
flash[:notice] = "Your profile was updated. %s"
flash[:notice_item] = ["Edit again?", edit_profile_path(@profile)]
Entonces podrías tener ayudantes que se parezcan a 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 así:
<%= render_flash_messages(:error, :notice, :warning) %>
La vista (a través del ayudante flash_message_with_item
) es responsable de crear la etiqueta de anclaje, pero el controlador administra lo que entra en el mensaje flash, incluido un recurso opcional para acciones adicionales.
Solo pensé en compartir esto, ya que encontré la respuesta que estaba buscando en otra parte:
Trabajos sobre rieles 3.1.
flash[:notice] = "Proceed to #{view_context.link_to(''login page'', login_path)}".html_safe