2009-10-21 11 views
8

Quando un utente non riesce login sul mio Rails app, mi piacerebbe farli puntare ad una pagina di reimpostazione password:link_to() in Rails lampeggiano

flash[:notice] = "Login failed. If you have forgotten your password, you can #{link_to('reset it', reset_path)}" 

Tuttavia, non posso utilizzare link_to in un controllore . Qual è il modo migliore per farlo senza combinare controller e logica di visualizzazione?

La mia ipotesi migliore è che il flash sia il posto sbagliato per farlo, ma apprezzerei qualsiasi input.

risposta

9

Penso che la soluzione più comune sia quella di incollare un collegamento alla pagina di reimpostazione della password nel modulo di accesso, in modo che il messaggio flash non debba occuparsene affatto. Ciò consente anche all'utente di richiedere il ripristino senza prima effettuare il login.

Se si desidera farlo nel messaggio flash, è necessario utilizzare url_for per creare il collegamento anziché link_to.

In alternativa, è possibile eseguire il rendering parziale anziché codificare manualmente il messaggio nel controller.

flash[:error] = render_to_string(:partial => "shared/login_failed_message") 

# in shared/_login_failed_message.html.erb 
<%= "Login failed. If you have forgotten your password, you can #{link_to('reset it', reset_path)}" %> 
+0

Grazie - il parziale è esattamente quello che mi serviva. – Grandpa

+1

Trovo che questo non funzioni (in Rails 3.1) perché tutto l'output è sfuggito prima del rendering. Quindi ottieni qualcosa come "Elenco salvato su a href = "/teams/1 " > Team di David Tuite </a >" –

+2

Basta aggiungere il metodo .html_safe e dovrebbe funzionare. – MarioRicalde

5
flash[:notice] = "Login failed. If you have forgotten your password, you can <a href='#{url_for(reset_path)}'>reset it</a>" 

corretta, link_to è un aiutante vista. prego noi un modo più generico di costruire il collegamento, à la url_for