在控制器中否决了之前的redirect_to

时间:2015-11-05 09:38:41

标签: ruby-on-rails controller activeadmin ruby-on-rails-4.1

鉴于以下简化情况(实际上,该方案来自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并用另一个方法推翻它吗?

感谢您的提示!

2 个答案:

答案 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