Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在后过滤器中响应_Ruby On Rails_Filter_Controller - Fatal编程技术网

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;也许它贬值了?或者我做得不对?