我正在寻找关于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)
答案 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)