Ruby on rails 在后过滤器中响应
我喜欢通过在过滤器前后放置重复出现的代码来干燥控制器。在我当前的项目中,每个操作都有相同的Ruby on rails 在后过滤器中响应,ruby-on-rails,filter,controller,Ruby On Rails,Filter,Controller,我喜欢通过在过滤器前后放置重复出现的代码来干燥控制器。在我当前的项目中,每个操作都有相同的respond\u to块: respond_to do |wants| wants.html wants.js { render :layout => "transition" } end 我将其放置在一个后过滤器中,如下所示: after_filter :respond_to_html_or_transition 但它导致了这个错误: 在此操作中多次调用渲染和/或重定向。 请注意,您最
respond\u to
块:
respond_to do |wants|
wants.html
wants.js { render :layout => "transition" }
end
我将其放置在一个后过滤器中,如下所示:
after_filter :respond_to_html_or_transition
但它导致了这个错误:
在此操作中多次调用渲染和/或重定向。
请注意,您最多只能调用render或redirect
每个动作一次。还要注意,重定向和渲染都不会终止
操作的执行,因此如果要在
重定向,您需要执行类似“重定向到(…)和
返回”
即使操作中没有明确的响应
或重定向
,也会发生这种情况。我假设发生这种情况是因为Rails(由于缺少明确的respond\u to
调用)做出了有根据的猜测,并在after\u过滤器之前创建了自己的respond\u to
。如果是这样的话,我有没有办法阻止Rails这样做,而是使用after\u filter
中的块?你试图用after\u filter实现的目标是不可能的。after筛选器处理已渲染的操作。此时,渲染已经完成(显式或隐式渲染),因此调用render将导致双重调用
您可以提取方法中的代码逻辑并调用该方法。另一种选择是将所有操作都作为单个操作的别名,假设操作体可以由单个方法处理
最后但并非最不重要的一点是,您可以编写自定义操作响应程序并替换控制器设置的默认响应程序
self.responder = CustomActionResponder
最后一个选项似乎是最佳路径,尽管我在实现上遇到了问题。用渲染布局覆盖to_js
方法:“transition”
不起作用。它渲染,但不使用“过渡”布局。只是让它工作<代码>渲染布局:“过渡”
可以。真正的问题来自我如何分配响应者。我没有将self.responder=CustomActionResponder
放在控制器内部(这是您和几个博客都推荐的),而是在每个操作结束时将responder与(@items,:responder=>CustomActionResponder)
放在一起。这是冗长的,但它的工作。我想知道为什么另一种方法不起作用。我使用的是Rails 4;也许它贬值了?或者我做得不对?