2010-07-03 8 views
16

Dans mon application, j'ai une petite boîte qui apparaît sur chaque page, vérifiant l'état des demandes faites par l'utilisateur. Si une demande est acceptée à tout moment, l'utilisateur doit automatiquement être redirigé vers une page spécifique. Ceci est mon code à ce jour:Puis-je utiliser redirect_to dans une vue dans RoR?

<% offersMade.each do |w| %> 
    <% if w.accepted == true %> 
    <% redirect_to offer_path(:email => "[email protected]") %> 
    <% end %> 
<% end %> 

Mais j'obtiens cette erreur:

undefined method `redirect_to' for #<ActionView::Base:0x1042a9770> 

est-il pas possible de redirect_to utilisateur dans une vue? Sinon, y a-t-il autre chose que je peux utiliser? Merci d'avoir lu.

Répondre

29

redirect_to est une méthode de ActionController :: Base Class que vous ne pouvez pas utiliser dans ActionView.

Vous pouvez essayer de suivre

<% if w.accepted == true %> 
    <script type="text/javascript"> 
    window.location.href="/logins/sign_up" // put your correct path in a string here 
    </script> 
<% end %> 

Edité pour le paramètre email

window.location.href="/logins/sign_up?email=<%= w.email %>" 

Désolé, je ne sais pas s'il y a quelque chose en rubis pour cela.

+0

Merci, cela fonctionne très bien. Savez-vous si je peux utiliser une variable RoR dans la construction url? Dans mon code d'origine en haut, j'ai (: email => "[email protected]"), je ne suis pas sûr si je peux faire quelque chose de similaire à partir de javascript? – ben

+0

vérifier ma réponse éditée. – Salil

+0

Merci beaucoup, ça marche! Je ne pensais pas que vous pourriez intégrer ruby ​​dans js mais apparemment vous pouvez. Merci encore! – ben

1

redirect_to n'est pas une méthode de ActionView. C'est une méthode de ActionController. Vous pouvez probablement utiliser Javascript window.location.href lors du chargement de la page ou d'un autre événement pour amener votre utilisateur sur une autre page.

+1

Merci pour votre aide, ne savait pas cela. – ben

6

Le code dans la vue pourrait être déplacé dans le contrôleur, ce qui rendrait redirect_to disponible.

class ApplicationController < ActionController::Base 
    before_action :check_for_accepted_offer 

    def check_for_accepted_offer 
    if Offer.any? { |o| o.accepted } 
     redirect_to offer_path(:email => "[email protected]") 
    end 
    end 
end 

Si l'OP voulait changer immédiatement l'URL lorsqu'une offre est acceptée, aucun du code Ruby indiqué dans les réponses aiderait car il est uniquement si la page est chargée. L'OP aurait besoin d'installer une sorte de stratégie de sondages ou pousser pour alerter le navigateur lorsqu'une offre a été acceptée, puis utiliser le redirection JavaScript système affiché dans une autre réponse:

window.location.href="/logins/sign_up?email=<%= w.email %>" 

Bien, cela ne répond pas à la question : "Comment puis-je utiliser redirect_to dans une vue", je pense que cette réponse aurait finalement été plus utile à l'OP. J'ai trébuché sur quelqu'un en utilisant cette réponse pour rediriger vers une autre page, lorsque la redirection aurait dû être effectuée dans le contrôleur.

0

Oui, vous pouvez appeler controller.redirect_to à partir de votre vue pour obtenir ce que vous voulez sans avoir à afficher toute la réponse et ensuite utiliser javascript sur le client pour faire une nouvelle demande.

Dans votre exemple, cela ressemblerait à ceci:

<% offersMade.each do |w| %> 
    <% if w.accepted == true %> 
    <% controller.redirect_to offer_path(:email => "[email protected]") %> 
    <% end %> 
<% end %> 

Notez que cette controller.redirect_to ne sera pas sortir de la boucle, de sorte que vous voudrez probablement break, et vous aurez probablement envie de faire en sorte que le reste de votre vue n'est rendu que conditionnellement si vous ne l'avez pas redirigé. (Avertissement: Je ne tolère pas nécessairement cette technique.Vous feriez mieux de le faire dans votre contrôleur ou assistant, comme d'autres l'ont mentionné.)

16

Si vous souhaitez utiliser redirect_to de vue, faire cette méthode:

syntaxe: <% chemin controller.redirect_to%>

Exemple: <% controller.redirect_to users_profile_path%>

+3

Ceci est une excellente façon de le faire plus nativement et évitez JavaScript! –

+0

Quand j'ai utilisé ceci, j'avais besoin du mot 'controller', pas du nom du contrôleur. Cela a bien fonctionné. –

Questions connexes