鉴于以下简化情况(实际上,该方案来自ActiveAdmin支持的应用程序):
class ShapeController < ApplicationController
def update
(...)
redirect_to
end
end
class CircleController < ShapeController
def update
super
(...)
redirect_to
end
end
调用CircleController#update
将导致着名的“AbstractController :: DoubleRenderError”,因为redirect_to
被调用两次。
现在,我无法阻止redirect_to
super
的第一次调用,至少在没有弄乱ActiveAdmin的代码的情况下。还有另一种方法可以取消第一个redirect_to
并用另一个方法推翻它吗?
感谢您的提示!
答案 0 :(得分:1)
ActiveAdmin使用Inherited Resources执行标准REST操作。 gem提供了一种覆盖respond_to块的方法。我之前从未尝试过,但这可能对您的情况有所帮助:
ActiveAdmin.register Circle do
# ...
controller do
def update
update! do |success, failure|
failure.html { redirect_to circle_url(@circle) }
end
end
end
# ...
end
有关覆盖操作的更多选项,请参阅IR gem文档(在“覆盖操作”部分下)。
答案 1 :(得分:0)
我会说这是不可能的。最好的解决方案是在一些受保护的控制器方法中提取动作代码,并从子控制器调用它:
class ShapeController < ApplicationController
def update
do_the_update
redirect_to
end
protected
def do_the_update
# your code
end
end
class CircleController < ShapeController
def update
do_the_update
redirect_to
end
end