Ruby on Rails: redirect_to не работает после создания и сохранения - PullRequest
6 голосов
/ 13 января 2012

Я хочу redirect_to slider_path после того, как пользователь отправит свою электронную почту.В настоящее время только сообщение об успехе отображается без перенаправления.Вот код:

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

Ответы [ 4 ]

6 голосов
/ 13 января 2012

Rails API состояния:

Действие может содержать только один рендер или одно перенаправление. Попытка повторить попытку приведет к ошибке DoubleRenderError:

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

Если вам нужно перенаправить что-либо при условии, то обязательно добавьте «и вернитесь», чтобы остановить выполнение.

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

Обратите внимание на использование and return

6 голосов
/ 13 января 2012

Просто замените эту часть своего кода:

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

с этим:

  if success
    flash[:success] = message
    redirect_to slider_path
  else 
    flash[:error] = message
    redirect_to root_path 
  end
2 голосов
/ 28 июля 2013

Ни перенаправление, ни рендеринг не прекращают выполнение действия, поэтому, если вы хотите выйти из действия после перенаправления, вам нужно сделать что-то вроде "redirect_to (...) и return".

2 голосов
/ 13 января 2012

Добавьте оператор возврата после вашего перенаправления. Если действие также отображает шаблон по умолчанию, за любыми перенаправлениями должен следовать оператор возврата.

if success
  flash[:success] = message
  redirect_to slider_path
  return                    # <= Add a return.
else
  flash[:error] = message
end
redirect_to root_path
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...