Question

La possibilité d'avoir des messages flash (avis, erreur, avertissement, etc.) avec des liens intégrés est agréable d'un point de vue de l'interaction de l'utilisateur. Cependant, l'inclusion d'une balise d'ancrage dans un message flash du contrôleur est sale.

Supposons qu'un message flash comme celui-ci est bon pour la facilité d'utilisation *:

Exemple flash message avis avec un lien incorporé http://img.skitch.com/20090826- xbsa4tb3sjq4fig9nmatakthx3.png ( DailyMile.com )

Quelle tactique prendriez-vous entre le contrôleur et la vue d'employer quelque chose comme ça proprement?

Était-ce utile?

La solution

Je pensais juste que je partage, puisque la réponse trouvée que je cherchais ailleurs:

Travaux sur rails 3.1

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

Autres conseils

Glenn Gillen a une approche qu'il appelle messages utiles flash dans rails .

Je modifié ses extraits de code pour être un peu plus idiomatiques (pour moi au moins).

Le contrôleur remplit le flash comme ceci:

flash[:notice]      = "Your profile was updated. %s"
flash[:notice_item] = ["Edit again?", edit_profile_path(@profile)]

Vous pourriez alors des aides qui ont l'air quelque chose comme ceci:

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 vue ressemble simplement à ceci:

<%= render_flash_messages(:error, :notice, :warning) %>

Le point de vue (via l'assistant flash_message_with_item) est responsable de la création de la balise d'ancrage, mais le contrôleur gère ce qui se passe dans le message flash, y compris une ressource en option pour d'autres mesures.

Vous pouvez créer une méthode d'aide pour rendre à partials en fonction de la valeur passée en arrière dans le message flash.

Ceci est similaire à link_to () en flash Rails

# 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)}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top