使用redirect_to后如何停止控制器执行? (使用Rails)

时间:2009-05-04 16:21:17

标签: ruby-on-rails error-handling

我有一个控制器,其中包含多个操作:年和月 来自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的?

我能想到的方法是在redirect_to之后抛出一个异常,或者从check_date返回一个值并在每个调用它的动作中检查它 - 比如

def month_index 
  year = params[:year].to_i
  month = params[:month].to_i
  if !check_date(year, month)
    return
  ...
end

但我想知道是否有一些很好的轨道方式来做到这一点。我是一半 希望调用redirect_to rails会认出我想要的 停下来,但似乎没有发生。

5 个答案:

答案 0 :(得分:48)

你也可以这样做:

return redirect_to :action => 'index'

return redirect_to :action => 'month_index', 
  :year => Date.today.year, 
  :month => Date.today.month,
  :type => params[:type]

因为它看起来比将回报放在自己的线上更好(恕我直言)。

答案 1 :(得分:35)

您可能想要使用过滤器。

如果您在控制器中将check_date称为before_filter,则呈现或重定向的事实将阻止控制器调用操作方法。它会在那里结束。

答案 2 :(得分:16)

你可以投入

return false

您希望在您的操作中执行代码的任何地方停止

答案 3 :(得分:6)

redirect_to只告诉rails完成时要渲染的内容。如果你在你真正想要的那个之后添加其他渲染或redirect_to指令,Rails会感到困惑,所以只需在redirect_to之后从控制器返回 - 它就是“正常”的做事方式。

答案 4 :(得分:1)

我认为OP对redirect_to的功能感到困惑。

redirect_to会在操作结束时重定向。但是,控制器功能的其余部分将照常执行。你需要做的就是(由其他人发布)包括一个返回,就像你应该进行任何其他函数调用一样。