使用redirect_to后如何停止控制器执行? (使用导轨)
Posted
技术标签:
【中文标题】使用redirect_to后如何停止控制器执行? (使用导轨)【英文标题】:How do I stop controller execution after using redirect_to? (Using Rails) 【发布时间】:2010-10-23 16:13:11 【问题描述】:我有一个控制器,其中包含多个操作,它们将 :year 和 :month 作为 来自 URL 的属性。我做了一个私有方法 check_date 检查日期是否有效,并检查日期不是将来。
def check_date(year, month)
if month < 1 || month > 12 || year < 2000
flash[:notice] = I18n.t 'archive.invalid_date'
redirect_to :action => 'index'
elsif year > Date.today.year || (year == Date.today.year && month > Date.today.month)
flash[:notice] = I18n.t 'archive.no_future'
redirect_to :action => 'month_index',
:year => Date.today.year,
:month => Date.today.month,
:type => params[:type]
end
end
在 重定向到?
我能想到的方法是要么在 redirect_to 之后抛出异常,要么从 check_date 返回一个值并在调用它的每个操作中检查它 - 类似于
def month_index
year = params[:year].to_i
month = params[:month].to_i
if !check_date(year, month)
return
...
end
但我想知道是否有一些不错的 rails 方法可以做到这一点。我是一半 希望调用redirect_to rails的人会认出我想 停止,但这似乎没有发生。
【问题讨论】:
【参考方案1】:你也可以这样做:
return redirect_to :action => 'index'
和
return redirect_to :action => 'month_index',
:year => Date.today.year,
:month => Date.today.month,
:type => params[:type]
因为它看起来比将 return 放在自己的行上更好(恕我直言)。
【讨论】:
或redirect_to :action => 'index' and return
我愿意,但“在此操作中多次调用了渲染和/或重定向”
@Matrix 不幸。看起来这在 Rails 5 中不再适用。
@Rigo 我认为你的想法不安全,因为如果redirect_to
返回一个虚假值,那么你的return
将被忽略!【参考方案2】:
您可能想要使用过滤器。
如果您在控制器中将check_date
称为before_filter
,则它呈现或重定向的事实将阻止控制器调用操作方法。到此结束。
【讨论】:
这可能会解决提问者的问题,但我来到这里期待像 vrish88 这样的解决方案。【参考方案3】:你可以扔
return false
您希望在您的操作中停止执行代码的任何位置
【讨论】:
其实只需要返回即可。 是的,但是当它在一个私有函数中时,我必须检查返回值,所以我正在寻找一种更自动的方式——比如 before_filter @HamishDowner 在这种情况下,我肯定会让私有函数以它正在做的事情的本机形式返回状态,即如果它返回其他符号则返回一个符号,如果它正常返回一个false
返回true
,如果它通常返回其他数据,则返回nil
,或者甚至可能是输出变量的形式或异常,如果这似乎最适合帮助者。然后控制器应该接受私有函数表达的负面状态,并对此做出反应。将控制器方法的功能混合到私有函数中不仅会很快变得混乱,而且会阻碍可重用性。【参考方案4】:
redirect_to 只是告诉 Rails 完成后要渲染什么。如果您在真正想要的指令之后添加其他 render 或 redirect_to 指令,Rails 会感到困惑,因此只需在 redirect_to 之后从控制器返回 - 这是“正常”的 rails 做事方式。
【讨论】:
【参考方案5】:我认为OP对redirect_to
的功能感到困惑。
redirect_to
将在操作结束时重定向。但是,控制器功能的其余部分将照常执行。您所要做的(正如其他人所发布的)就是包含一个返回,就像任何其他函数调用一样。
【讨论】:
以上是关于使用redirect_to后如何停止控制器执行? (使用导轨)的主要内容,如果未能解决你的问题,请参考以下文章
在 Node.js 中如何停止脚本执行,成功向控制台写入错误消息,然后退出脚本?