after_filter中的respond_to

时间:2013-05-02 16:00:43

标签: ruby-on-rails filter controller

我喜欢通过在过滤器之前和之后放置重复出现的代码来干燥我的控制器。在我当前的项目中,每个操作都有相同的respond_to块:

respond_to do |wants|
  wants.html
  wants.js { render :layout => "transition" }
end

我把它放在after_filter中,如此:

after_filter :respond_to_html_or_transition

但它导致了这个错误:

  

在此操作中多次调用渲染和/或重定向。   请注意,您最多只能调用渲染或重定向   每次行动一次。另请注意,重定向和渲染都不会终止   执行动作,所以如果你想在之后退出动作   重定向,你需要做一些像“redirect_to(...)和   返回”。

即使操作中没有明确的respond_toredirect,也会发生这种情况。我假设发生这种情况是因为Rails(缺少明确的respond_to调用)进行了有根据的猜测并在respond_to之前创建了自己的after_filter。如果是这种情况,我有什么方法可以让Rails不这样做,而是使用after_filter中的块?

1 个答案:

答案 0 :(得分:0)

使用after_filter无法实现您想要完成的任务。后过滤器处理已经呈现的操作。此时,渲染已经完成(显式或隐式渲染),因此调用渲染将导致双重调用。

您可以在方法中提取代码逻辑并调用该方法。另一种选择是将单个动作的所有动作别名,假设动作的主体可以通过单个方法处理。

最后但并非最不重要的是,您可以编写自定义操作响应程序并替换控制器设置的默认操作

self.responder = CustomActionResponder