2010-07-03 6 views
16

Nella mia app, ho una piccola scatola che appare in ogni pagina, controllando lo stato delle richieste fatte dall'utente. Se una richiesta viene accettata in qualsiasi momento, l'utente deve essere automaticamente portato su una determinata pagina. Questo è il mio codice finora:Posso usare redirect_to in una vista in RoR?

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

ma sto ottenendo questo errore:

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

Non è possibile redirect_to utente in vista? Se no, c'è qualcos'altro che posso usare? Grazie per aver letto.

risposta

29

redirect_to è un metodo di ActionController :: Base Class quindi non è possibile utilizzarlo in ActionView.

Si può provare a seguito

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

A cura per il parametro e-mail

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

dispiace non so se c'è qualcosa in Ruby per questo.

+0

Grazie, funziona benissimo. Sai se c'è un modo in cui posso usare una variabile RoR nella costruzione dell'URL? Nel mio codice originale in cima, ho (: email => "[email protected]"), non sono sicuro se posso fare qualcosa di simile da dentro javascript? – ben

+0

controlla la mia risposta modificata. – Salil

+0

Grazie mille, funziona! Non pensavo che potessi incorporare il rubino in js ma a quanto pare puoi. Grazie ancora! – ben

1

redirect_to non è un metodo di ActionView. È un metodo di ActionController. Probabilmente puoi usare Javascript window.location.href al caricamento della pagina o qualche altro evento per portare il tuo utente su un'altra pagina.

+1

Grazie per il vostro aiuto, non lo sapevo. – ben

6

Il codice nella vista potrebbe essere spostato nel controller che renderebbe redirect_to disponibile.

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 

Se il PO voleva cambiare immediatamente l'URL quando l'offerta è stata accettata, allora nessuno dei codice Ruby mostrato nelle risposte aiuterebbe perché viene valutata solo quando la pagina viene caricata. Il PO avrebbe bisogno di installare un qualche tipo di strategia di polling o spingere per avvisare il browser quando l'offerta è stata accettata e quindi utilizzare il codice JavaScript redirect schema pubblicato in un'altra risposta:

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

Anche se, questo non risponde alla domanda : "Come posso usare redirect_to in una vista", penso che questa risposta sarebbe stata in definitiva più utile per l'OP. Mi sono imbattuto in qualcuno che utilizzava questa risposta per reindirizzare a un'altra pagina, quando il reindirizzamento avrebbe dovuto essere eseguito nel controller.

0

Sì, è possibile chiamare controller.redirect_to dalla visualizzazione per ottenere ciò che si desidera senza dover eseguire il rendering dell'intera risposta e quindi utilizzare javascript sul client per effettuare una nuova richiesta.

Nel tuo esempio, questo sarebbe simile:

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

Si noti che questo controller.redirect_to non si romperà fuori del vostro ciclo, in modo che probabilmente si desidera break, e probabilmente si vorrà fare in modo che il resto della tua vista viene visualizzato in modo condizionato solo se non lo hai reindirizzato.

(Disclaimer: Io non condonò necessariamente questa tecnica. Faresti meglio a farlo nel tuo controller o helper, come altri hanno menzionato.)

16

Se si desidera utilizzare redirect_to alla vista, fare questo metodo:

sintassi: <% percorso controller.redirect_to%>

Esempio: <% controller.redirect_to users_profile_path%>

+3

Questo è un ottimo modo per farlo in modo più nativo ed evitare JavaScript! –

+0

Quando l'ho usato, avevo bisogno della parola 'controller', non del nome del controller. Questo ha funzionato bene. –

Problemi correlati