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?

¿Fue útil?

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)}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top