【问题标题】:Rails - ActiveAdmin & CanCan custom override method for initialize_cancan_abilityRails - 用于 initialize_cancan_ability 的 ActiveAdmin 和 CanCan 自定义覆盖方法
【发布时间】:2015-09-18 21:07:32
【问题描述】:

我正在尝试按照此处的建议将请求数据传递给能力模型:

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

那么我如何/在哪里可以重新定义initialize_cancan_ability,以便可以传入类似于current_ability 示例的请求数据?

基本上我希望像这样替换最后一行:

klass.new user, request

谢谢。

【问题讨论】:

    标签: ruby-on-rails activeadmin cancan cancancan


    【解决方案1】:

    您可以在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
    

    【讨论】:

    • 谢谢。这解决了主要问题,但不幸的是,request 对象不适用于该方法。
    【解决方案2】:

    如果你使用Devise,你可以从用户模型user.current_sign_in_ip访问Ip

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 2016-02-06
      • 2017-09-30
      相关资源
      最近更新 更多