【问题标题】:Overrule previous redirect_to in controller覆盖控制器中先前的 redirect_to
【发布时间】:2015-11-05 09:38:40
【问题描述】:

鉴于以下简化情况(实际上,该场景来自 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 并用另一个否决它吗?

感谢您的提示!

【问题讨论】:

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


    【解决方案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 文档(在覆盖操作部分下)。

    【讨论】:

      【解决方案2】:

      我会说这是不可能的。最好的解决方案是在某些受保护的控制器方法中提取操作代码,并从子控制器中调用它:

      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
      

      【讨论】:

      • 正如我所说,我知道如何在 ShapeController 中解决这个问题。但由于这将在 ActiveAdmin gem 中,我正在寻找另一种解决方案。
      • @svoop:我想没有解决办法,对不起
      猜你喜欢
      • 2016-07-30
      • 1970-01-01
      • 2013-09-29
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      相关资源
      最近更新 更多