2009-08-26 7 views
21

Die Fähigkeit, Flash-Nachrichten (Benachrichtigung, Fehler, Warnung, usw.) mit eingebetteten Links zu haben, ist vom Standpunkt der Benutzerinteraktion gut. Das Einbetten eines Anker-Tags in eine Flash-Nachricht vom Controller ist jedoch fehlerhaft.Welchen Ansatz verfolgen Sie beim Einbetten von Links in Flash-Nachrichten?

Nehmen wir an, dass ein Flash-Meldung wie diese für die Benutzerfreundlichkeit ist gut *:

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

Welche Taktik würden Sie zwischen dem Controller und Sicht nehmen so etwas wie zu beschäftigen das sauber?

Antwort

24

dachte nur, ich würde dies teilen, ich wurde an anderer Stelle, da gefunden Antwort suchen:

Arbeiten auf Schienen 3,1

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

danke dafür. genial. – Dty

+0

danke für die Aktualisierung dieser Frage mit einer Rails 3.1 Antwort! – jpwynn

+0

Dies als die neue akzeptierte Antwort machen. Das ist viel klarer als der Ansatz, den ich vorher gemacht habe. Ich war mir nicht bewusst, dass der "view_context" -Accessor. –

1

Sie könnten eine Hilfsmethode zum Rendern von Teiltagen basierend auf dem in der Flash-Nachricht zurückgegebenen Wert erstellen.

+0

Das ist wie fühlt sich fast zu viel Trennung. Wohin verwalten Sie auch, mit welchem ​​Objekt oder Pfad verbunden werden soll, ohne auf globale Instanzvariablen in den Teiltagen angewiesen zu sein? –

8

hat einen Ansatz, den er Useful Flash Messages in Rails nennt.

Ich modifizierte seine Code-Schnipsel etwas idiomatischer (für mich zumindest).

Der Regler füllt den Blitz wie folgt aus:

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

Sie könnten dann Helfer haben, die wie folgt aussehen:

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 

Der Blick sieht einfach wie folgt aus:

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

Die Ansicht (über den Helper flash_message_with_item) ist für die Erstellung des Anker-Tags verantwortlich , aber der Controller verwaltet, was in die Flash-Nachricht eingeht, einschließlich einer optionalen Ressource für weitere Aktionen.

+3

Ich hoffte auf einige clevere Vorschläge, aber ich werde jetzt mit diesem Ansatz gehen. –

1

Dies ist ähnlich 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)}