2012-01-13 8 views
5

Quiero redirect_to slider_path después de que un usuario envíe su correo electrónico. Actualmente, solo se muestra el mensaje de éxito sin una redirección. Aquí está el código:Ruby on Rails: redirect_to no funciona después de crear y guardar

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 

Respuesta

6

basta con sustituir esta parte de su código:

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

con esto:

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

Agregue una declaración de devolución después de su redirección. Si la acción también representa una plantilla por defecto, cualquier redirección debe ir seguida de una declaración de devolución.

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 estados:

Una acción puede contener sólo un único render o un solo redirección. El intento de tratar de hacer bien otra vez dará lugar a una DoubleRenderError:

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

Si necesita volver a dirigir con la condición de algo, a continuación, asegúrese de agregar “y retorno” para detener la ejecución.

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 el uso de and return

2

Ni redirigir ya no prestar terminar la ejecución de la acción , así que si quieres salir de una acción después de redireccionar, debes hacer algo ke "redirect_to (...) and return".