before_action从超类扩展

时间:2014-11-05 08:32:22

标签: ruby-on-rails

我有下一个定义:

的ApplicationController:

before_action :set_resource, only: [:edit, :update, :destroy]
...
private

def set_resource
...

OtherController < ApplicationController

    before_action :set_resource, only: [:new_action1, :new_action2]
    ...
    def new_action1
    ....
    def new_action2

我希望在操作edit, update, destroy, new_action1, new_action2之前调用 set_resource 方法,但它仅适用于方法:edit, update, destroy

1 个答案:

答案 0 :(得分:0)

我在为Redmine编写插件时遇到了几乎同样的问题。 在Redmine中有一个带有回调的issues_controller:

OtherController < ApplicationController
  before_filter :find_issue, :only => [:show, :edit, :update]
  before_filter :authorize, :except => [:index]
end

我在模块中添加了另一个包含在issues_controller中的操作:

module IssuesControllerPatch
  def self.included(base)
    before_filter :find_issue, :only => [:show, :edit, :update, :merge]
  end
end

这里发生的事情是新添加的合并操作过滤器在授权方法后被称为,因此授权失败。

为了解决这个问题,我覆盖了这样的授权方法:

module IssuesControllerPatch
  def self.included(base)
    base.send(:include, InstanceMethods)

    base.class_eval do
      alias_method :default_authorize, :authorize
      alias_method :authorize, :authorize_with_merge
    end
  end

  module InstanceMethods
    def authorize_with_merge
      find_issue if params[:action] == "merge" && params[:controller] == "issues"
      default_authorize
    end
  end
end

不太优雅,但却像魅力一样。这也应该对你有帮助。