2009-10-21 10 views
8

Lorsqu'un utilisateur échoue connexion sur mon application Rails, je voudrais les pointer vers une page de réinitialisation de mot de passe:link_to() Rails clignotent

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

Cependant, je ne peux pas utiliser link_to dans un contrôleur . Quelle est la meilleure façon de le faire sans mélanger le contrôleur et la logique de vue?

Ma meilleure estimation est que le flash est le mauvais endroit pour le faire, mais j'apprécierais toute entrée.

Répondre

9

Je pense que la solution la plus courante consiste à coller un lien vers la page de réinitialisation du mot de passe directement dans votre formulaire de connexion, afin que votre message flash ne soit pas du tout traité. Cela permet également à l'utilisateur de demander la réinitialisation sans d'abord ne pas se connecter.

Si vous voulez le faire dans le message flash, vous devez utiliser url_for pour créer le lien au lieu de link_to. Vous pouvez également rendre un message partiel au lieu de coder en dur le message dans votre automate.

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

Merci - la partie est exactement ce que je avais besoin. – Grandpa

+1

Je trouve que cela ne fonctionne pas (dans Rails 3.1) car toute sortie est échappée avant d'être rendue. Donc, vous obtenez quelque chose comme "Annonce enregistrée à < un href = "/teams/1 " > L'équipe de David Tuite </a >" –

+2

Ajoutez simplement la méthode .html_safe et cela devrait fonctionner. – MarioRicalde

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

Corriger, link_to est une aide de vue. Merci de nous d'une manière plus générique de la construction du lien, à la url_for

Questions connexes