2010-07-03 14 views
16

In meiner App habe ich eine kleine Box, die auf jeder Seite erscheint und den Status der Anfragen des Benutzers überprüft. Wenn eine Anfrage zu irgendeinem Zeitpunkt akzeptiert wird, sollte der Benutzer automatisch zu einer bestimmten Seite gebracht werden. Dies ist mein Code so weit:Kann ich redirect_to in einer Ansicht in RoR verwenden?

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

Aber ich diesen Fehler:

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

Ist es an Benutzer redirect_to in einer Ansicht nicht möglich? Wenn nicht, kann ich noch etwas anderes benutzen? Danke fürs Lesen.

Antwort

29

redirect_to ist eine Methode von ActionController :: Base Class, so dass Sie sie nicht in ActionView verwenden können.

Sie können versuchen, folgende

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

Edited für den E-Mail-Parameter

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

Leider weiß ich nicht, ob es für das alles in Ruby ist.

+0

Danke, das funktioniert super. Weißt du, ob es eine Möglichkeit gibt, eine RoR-Variable in der URL-Konstruktion zu verwenden? In meinem ursprünglichen Code oben, habe ich (: email => "[email protected]"), ich bin mir nicht sicher, ob ich etwas ähnliches innerhalb von Javascript tun kann? – ben

+0

Überprüfen Sie meine bearbeitete Antwort. – Salil

+0

Vielen Dank, es funktioniert! Ich dachte nicht, du könntest Ruby in JS einbetten, aber anscheinend kannst du es. Danke noch einmal! – ben

1

redirect_to ist keine Methode von ActionView. Es ist eine Methode von ActionController. Sie können wahrscheinlich Javascript window.location.href beim Laden der Seite oder eines anderen Ereignisses verwenden, um Ihren Benutzer auf eine andere Seite zu bringen.

+1

Danke für Ihre Hilfe, wusste das nicht. – ben

6

Der Code in der Ansicht könnte in den Controller verschoben werden, der redirect_to verfügbar machen würde.

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 

Wenn die OP die URL sofort ändern wollte, wenn ein Angebot dann keinen des Ruby-Code in den Antworten helfen würde, gezeigt akzeptiert wird, weil es nur dann, wenn die Seite geladen wird ausgewertet wird. Die OP würde eine Art von Polling oder Push-Strategie einrichten müssen Sie den Browser alarmieren, wenn ein Angebot angenommen wurde und dann die JavaScript-Schema in einer anderen Antwort gepostet umleiten verwenden:

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

Obwohl dies keine Antwort auf die Frage : "Wie kann ich redirect_to in einer Ansicht verwenden?" Ich denke, diese Antwort wäre letztendlich für das OP nützlicher gewesen. Ich bin über jemanden gestolpert, der diese Antwort verwendet, um auf eine andere Seite umzuleiten, wenn die Weiterleitung in der Steuerung hätte durchgeführt werden sollen.

0

Ja, Sie können aus Ihrer Sicht controller.redirect_to anrufen, um zu bekommen, was Sie wollen, ohne die ganze Antwort rendern zu müssen und dann Javascript auf dem Client zu verwenden, um eine neue Anfrage zu stellen.

In Ihrem Beispiel würde dies wie folgt aussehen:

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

Beachten Sie, dass diese controller.redirect_to nicht aus der Schleife brechen, so dass Sie wahrscheinlich zu break wollen, und Sie werden wahrscheinlich sicherstellen möchten, dass Der Rest Ihrer Ansicht wird nur bedingt wiedergegeben, wenn Sie nicht umgeleitet haben.

(Haftungsausschluss: Ich dulde diese Technik nicht unbedingt. Sie wären besser in Ihrem Controller oder Helfer, wie andere bereits erwähnt haben.)

16

Wenn Sie redirect_to aus Sicht verwenden möchten, tun diese Methode:

Syntax: <% controller.redirect_to path%>

Beispiel: <% controller.redirect_to users_profile_path%>

+3

Dies ist eine gute Möglichkeit, dies mehr nativ zu tun und JavaScript zu vermeiden! –

+0

Wenn ich das verwendete, brauchte ich das Wort "Controller", nicht den Namen des Controllers. Das hat gut funktioniert. –

Verwandte Themen