2012-01-13 1 views
5

Desidero specificare redirect_to slider_path dopo che un utente ha inviato la sua email. Attualmente, solo il messaggio di successo viene visualizzato senza un reindirizzamento. Ecco il codice:Ruby on Rails: redirect_to non funziona dopo la creazione e il salvataggio

class Splash::SubscribersController < ApplicationController 

def create 

    @subscriber = Subscriber.new(params[:subscriber]) 

    if @subscriber.save 
    success = true 
    message = "Success! We'll let you know when we launch." 
    else 
    success = false 
    message = "Fail." 
    end 

    respond_to do |format| 
    format.html { 
     if success 
     flash[:success] = message 
     redirect_to slider_path 
     else 
     flash[:error] = message 
     end 
     redirect_to root_path 
    } 
    format.json { render :json => { :success => success, :message => message }.to_json } 
    end 
end 
end 

risposta

6

basta sostituire questa parte del codice:

if success 
    flash[:success] = message 
    redirect_to slider_path 
    else 
    flash[:error] = message 
    end 
    redirect_to root_path 

con questo:

if success 
    flash[:success] = message 
    redirect_to slider_path 
    else 
    flash[:error] = message 
    redirect_to root_path 
    end 
2

Aggiungi una dichiarazione di reso dopo il reindirizzamento. Se l'azione esegue anche il rendering di un modello per impostazione predefinita, qualsiasi reindirizzamento deve essere seguito da un'istruzione di ritorno.

if success 
    flash[:success] = message 
    redirect_to slider_path 
    return     # <= Add a return. 
else 
    flash[:error] = message 
end 
redirect_to root_path 
6

Rails API stati:

Un'azione può contenere solo un singolo di rendering o di una singola reindirizzamento. Il tentativo di cercare di fare sia ancora una volta si tradurrà in un DoubleRenderError:

def do_something 
    redirect_to :action => "elsewhere" 
    render :action => "overthere" # raises DoubleRenderError 
end 

Se è necessario reindirizzare sulla condizione di qualcosa, quindi assicuratevi di aggiungere “andata e ritorno” per fermare l'esecuzione.

def do_something 
    redirect_to(:action => "elsewhere") and return if monkeys.nil? 
    render :action => "overthere" # won't be called if monkeys is nil 
end 

Nota l'uso di and return

2

Né reindirizzare né rendere terminare l'esecuzione dell'azione , quindi se vuoi uscire da un'azione dopo il reindirizzamento, devi fare qualcosa li ke "redirect_to (...) e return".