我有下一个定义:
的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
答案 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
不太优雅,但却像魅力一样。这也应该对你有帮助。