2009-08-26 11 views
21

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, incrustar una etiqueta de anclaje dentro de un mensaje flash del controlador está sucio.¿Qué enfoque toma para incrustar enlaces en mensajes flash?

Supongamos que un mensaje flash como esto es bueno para la facilidad de uso *:

Example Flash Message Notice with an Embedded Link http://img.skitch.com/20090826-xbsa4tb3sjq4fig9nmatakthx3.png (tomado de DailyMile.com)

Qué táctica le llevará entre el controlador y el fin de emplear algo así como esto limpiamente?

Respuesta

24

sólo pensé que iba a compartir esto, ya que la respuesta se encuentra que estaba buscando en otra parte:

obras sobre raíles 3,1

flash[:notice] = "Proceed to #{view_context.link_to('login page', login_path)}".html_safe 
+0

gracias por esto. increíble. – Dty

+0

gracias por actualizar esta pregunta con una respuesta de Carriles 3.1! – jpwynn

+0

Haciendo esto como la nueva respuesta aceptada. Esto es mucho más claro que el enfoque que estaba tomando antes. No estaba al tanto del acceso 'view_context'. –

1

Puede crear un método auxiliar para representar parciales en función del valor que se devuelve en el mensaje flash.

+0

Esto casi se siente como demasiada separación. Además, ¿dónde se gestiona a qué objeto o ruta se debe vincular sin confiar en variables de instancia de tipo global dentro de los parciales? –

8

Glenn Gillen tiene un enfoque que él llama Useful Flash Messages in Rails.

Modifiqué sus fragmentos de código para que fueran un poco más idiomáticos (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 crear la etiqueta de anclaje , pero el controlador gestiona lo que entra en el mensaje flash, incluido un recurso opcional para acciones posteriores.

+3

Esperaba algunas sugerencias más inteligentes, pero voy a seguir con este enfoque por ahora. –

1

Esto es similar a link_to() in 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)} 
Cuestiones relacionadas