0

ここで提案されているように、リクエストデータをアビリティモデルに渡そうとしています:

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

ただし、CancanAdapter で ActiveAdmin を使用しており、次の方法で別の初期化呼び出しを使用しています。

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

ありがとう。

4

2 に答える 2

0

Deviseを使えばUserモデルからIPにアクセスできますuser.current_sign_in_ip

于 2015-09-21T06:41:14.763 に答える
0

下にファイルを作成し、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
于 2015-09-19T09:27:10.513 に答える