Rails - initialize_cancan_ability 的 ActiveAdmin 和 CanCan 自定义覆盖方法
Rails - ActiveAdmin & CanCan custom override method for initialize_cancan_ability
我正在尝试按照此处的建议将请求数据传递给能力模型:
class ApplicationController < ActionController::Base
#...
private
def current_ability
@current_ability ||= Ability.new(current_user, request.remote_ip)
end
end
这里:
class Ability
include CanCan::Ability
def initialize(user, ip_address=nil)
can :create, Comment unless BLACKLIST_IPS.include? ip_address
end
end
参见:https://github.com/ryanb/cancan/wiki/Accessing-request-data
但是,我将 ActiveAdmin 与 CancanAdapter 一起使用,它通过以下方式使用单独的初始化调用:
def initialize_cancan_ability
klass = resource.namespace.cancan_ability_class
klass = klass.constantize if klass.is_a? String
klass.new user
end
参见:https://github.com/activeadmin/activeadmin/blob/master/lib/active_admin/cancan_adapter.rb
所以how/where我可以重新定义initialize_cancan_ability
,以便我可以像current_ability
示例一样传入请求数据吗?
基本上我希望只替换最后一行:
klass.new user, request
谢谢。
您可以在 lib/monkey_patches/active_admin.rb
下创建一个文件,并将您覆盖的方法放在那里:
require 'cancan'
# Add a setting to the application to configure the ability
ActiveAdmin::Application.inheritable_setting :cancan_ability_class, "Ability"
module ActiveAdmin
private
def initialize_cancan_ability
klass = resource.namespace.cancan_ability_class
klass = klass.constantize if klass.is_a? String
klass.new user, request
end
end
end
如果您使用 Devise,您可以从用户模型访问 IP user.current_sign_in_ip
我正在尝试按照此处的建议将请求数据传递给能力模型:
class ApplicationController < ActionController::Base
#...
private
def current_ability
@current_ability ||= Ability.new(current_user, request.remote_ip)
end
end
这里:
class Ability
include CanCan::Ability
def initialize(user, ip_address=nil)
can :create, Comment unless BLACKLIST_IPS.include? ip_address
end
end
参见:https://github.com/ryanb/cancan/wiki/Accessing-request-data
但是,我将 ActiveAdmin 与 CancanAdapter 一起使用,它通过以下方式使用单独的初始化调用:
def initialize_cancan_ability
klass = resource.namespace.cancan_ability_class
klass = klass.constantize if klass.is_a? String
klass.new user
end
参见:https://github.com/activeadmin/activeadmin/blob/master/lib/active_admin/cancan_adapter.rb
所以how/where我可以重新定义initialize_cancan_ability
,以便我可以像current_ability
示例一样传入请求数据吗?
基本上我希望只替换最后一行:
klass.new user, request
谢谢。
您可以在 lib/monkey_patches/active_admin.rb
下创建一个文件,并将您覆盖的方法放在那里:
require 'cancan'
# Add a setting to the application to configure the ability
ActiveAdmin::Application.inheritable_setting :cancan_ability_class, "Ability"
module ActiveAdmin
private
def initialize_cancan_ability
klass = resource.namespace.cancan_ability_class
klass = klass.constantize if klass.is_a? String
klass.new user, request
end
end
end
如果您使用 Devise,您可以从用户模型访问 IP user.current_sign_in_ip