2011-09-21 10 views
34

Per il seguente codice, cosa succede se si sostituisce redirect_to con render o viceversa?Redirect_to e render exchangeable?

Sembra OK sostituire uno con l'altro nel codice sopra. Esiste un luogo in cui è necessario utilizzare solo redirect_to o render? Render non fa altro che mostrare una vista. Redirect_to invia 302 richieste al server e i parametri correnti vengono persi dopo il reindirizzamento.

Grazie.

risposta

98

Se stai usando render, quando l'utente aggiorna la pagina , invierà di nuovo la precedente richiesta POST. Ciò potrebbe causare risultati indesiderati come l'acquisto duplicato e altri.

enter image description here

Ma se si sta utilizzando redirect_to, quando l'utente aggiorna la pagina, sarà solo chiedere ancora una volta che la pagina stessa. Questo è anche noto come il modello Post/Redirect/Get (PRG).

enter image description here

Così il luogo in cui deve essere utilizzato redirect_to è quando si sta facendo una richiesta HTTP POST e non si desidera che l'utente per inviare nuovamente la richiesta quando è fatto (che può causare gli elementi duplicati e altri i problemi).

In Rails, quando un modello non viene salvato, render viene utilizzato per visualizzare nuovamente il modulo con le stesse voci che sono state precedentemente compilate. Questo è più semplice perché se si utilizza il reindirizzamento, è necessario passare le voci del modulo utilizzando i parametri o la sessione. L'effetto collaterale è che se si aggiorna il browser, proverà a inviare nuovamente le voci del modulo precedente. Questo è accettabile perché probabilmente fallirà allo stesso modo, o se ha successo ora, è comunque ciò che l'utente dovrebbe aspettarsi in ogni caso.

Per ulteriori informazioni approfondite su render e redirect, è necessario leggere questo article.

+0

Grazie. Questa è una spiegazione approfondita. – user938363

+0

Non penso di aver visto una spiegazione più perfetta, in particolare con WHY è importante con le differenze pratiche di casi d'uso alla fine. – ahnbizcad

+2

Nota: l'aggiornamento * non * equivale alla semplice pressione di invio nella barra degli indirizzi.Premendo Invio nella barra degli URL viene semplicemente inviata una richiesta GET a tale URL. L'aggiornamento ripresenta l'ultima richiesta (di cui il browser tiene traccia). –

9

Quando si effettua il reindirizzamento si genera una nuova richiesta che colpisce un metodo di controller, il rendering esegue solo il rendering della vista associata. Si utilizza il rendering nella creazione perché si desidera mantenere lo stato dell'oggetto modello se il salvataggio non riesce, in modo che sia possibile visualizzare informazioni sugli errori. Se si è tentato di reindirizzare il percorso new_product è necessario creare un nuovo oggetto del modello e perdere tutti i dati del modulo che l'utente è entrato e gli eventuali errori etc etc

EDIT (con qualche informazione in più):

Un esempio di un situazione in cui è NECESSARIO utilizzare redirect_to se il modello di vista utilizza variabili di istanza non inizializzate nel metodo del controller da cui si sta reindirizzando. Quindi probabilmente non potrebbe chiamare render {:action => 'index'} nel metodo creare perché il modello di indice probabilmente si avvale di una variabile @products ma il vostro inizializzato solo @product quindi sarebbe causare un'eccezione

+0

Sembra che il rendering sia sicuro da usare in più posti. C'è da qualche parte che redirect_to deve essere usato? Grazie. – user938363

+0

Vedere la modifica sopra per un esempio – Matthew

+0

Grazie per la risposta. – user938363