我有一个控制器,其中包含多个操作:年和月 来自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会认出我想要的 停下来,但似乎没有发生。
答案 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
会在操作结束时重定向。但是,控制器功能的其余部分将照常执行。你需要做的就是(由其他人发布)包括一个返回,就像你应该进行任何其他函数调用一样。