否决控制器中之前的 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被调用了两次。

现在,我无法阻止 superredirect_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 文档以了解更多覆盖操作的选项(在“覆盖操作”部分下)。