redirect_to!=返回

时间:2011-04-21 11:38:10

标签: ruby-on-rails

我正在寻找关于redirect_to的行为的一些澄清。

我有这段代码:

if some_condition
   redirect_to(path_one)
end

redirect_to(path_two)

如果some_condition == true我收到此错误:

  

在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,每次操作最多一次。

似乎该方法在redirect_to调用后继续执行。我需要编写这样的代码:

if some_condition
   redirect_to(path_one)
   return
end

redirect_to(path_two)

6 个答案:

答案 0 :(得分:92)

是的,您需要在进行重定向时从方法返回。它实际上只为响应对象添加了适当的头。

你可以写更多红宝石的方式:

if some_condition
    return redirect_to(path_one)
end

redirect_to(path_two)

或其他方式:

return redirect_to(some_condition ? path_one : path_two)

或其他方式:

redirect_path = path_one

if some_condition
    redirect_path = path_two
end

redirect_to redirect_path

答案 1 :(得分:29)

来自http://api.rubyonrails.org/classes/ActionController/Base.html

  

如果您需要重定向   什么条件,然后一定要   添加“并返回”以停止执行。

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

答案 2 :(得分:24)

您也可以

redirect_to path_one and return

看起来不错。

答案 3 :(得分:1)

值得注意的是,return需要没有,除非您在redirect_to之后有任何代码,如下例所示:

def show
  if can?(:show, :poll)
    redirect_to registrar_poll_url and return
  elsif can?(:show, Invoice)
    redirect_to registrar_invoices_url and return
  end
end

答案 4 :(得分:1)

Eimantas' answer中的“rubyish way”示例合并为两行代码:

return redirect_to(path_one) if some_condition

redirect_to(path_two)

答案 5 :(得分:0)

如果您想在方法或辅助函数中定义重定向,并在控制器中尽早返回:

ActionController::Metal#performed?-测试渲染或重定向是否已经发生:

def some_condition_checker
  redirect_to(path_one) if some_condition
end

这样称呼:

some_condition_checker; return if performed?

redirect_to(path_two)