否决控制器中之前的 redirect_to
Overrule previous redirect_to in controller
鉴于以下简化情况(实际上,该场景来自 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
被调用了两次。
现在,我无法阻止 super
对 redirect_to
的首次调用,至少在不扰乱 ActiveAdmin 代码的情况下是这样。有没有其他方法可以取消第一个 redirect_to
并用另一个取消它?
感谢您的提示!
我会说这是不可能的。最好的解决方案是在一些受保护的控制器方法中提取操作代码,并从子控制器调用它:
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
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 文档以了解更多覆盖操作的选项(在“覆盖操作”部分下)。
鉴于以下简化情况(实际上,该场景来自 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
被调用了两次。
现在,我无法阻止 super
对 redirect_to
的首次调用,至少在不扰乱 ActiveAdmin 代码的情况下是这样。有没有其他方法可以取消第一个 redirect_to
并用另一个取消它?
感谢您的提示!
我会说这是不可能的。最好的解决方案是在一些受保护的控制器方法中提取操作代码,并从子控制器调用它:
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
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 文档以了解更多覆盖操作的选项(在“覆盖操作”部分下)。