使用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 =&gt; '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 中如何停止脚本执行,成功向控制台写入错误消息,然后退出脚本?

如何在控制台错误时停止机器人框架套件的执行?

注销后如何停止 Symfony 重定向

WordPress登录redirect_to不起作用

在 Rails 中将 redirect_to 格式更改为 :js

支付成功后渲染视图