Канкан способности в отдельном файле

Можно ли определить способности в отдельном файле и включить их в файл ility.rb внутри метода initialize?

приведенный ниже код возвращает: попытался и получил: неопределенный метод 'может'

ability.rb

def initialize(user)
  include MyExtension::Something::CustomAbilities
  ...
end

Библиотека /my_extension/something.rb

module MyExtension::Something

  module CustomAbilities
      can :do_it, Project do |project|
      check_something_here and return true or false...
    end
  end

end

идеальным решением, если это возможно, было бы расширение класса Ability с помощью Ability.send:include/extension, поэтому без явного включения в метод initialize

2 ответа

Просто включите модуль и вызовите метод в initialize

Хитрость в том, чтобы создать модули для каждой из ваших способностей, включить их в свою базу ability.rb файл, а затем запустить конкретный метод в вашем initialize метод, вот так:

В вашем ability.rb файл:

class Ability

  include CanCan::Ability

  include ProjectAbilities 

  def initialize user
    # Your "base" abilities are defined here.

    project_abilities user
  end  

end

В вашем lib/project_abilities.rb файл:

module ProjectAbilities

  def project_abilities user
    # New abilities go here and later get added to the initialize method
    # of the base Ability class.

    can :read, Project do |project|
      user.can? :read, project.client || user.is_an_admin?
    end 
  end

end

Используя этот шаблон, вы можете разбить свои способности на различные модули (возможно, по одному для каждой модели, для которой вы должны определить пользовательские способности).

Взгляни на пандит

Также следует обратить внимание на (относительно) новый драгоценный камень под названием Pundit, который обеспечивает гораздо более масштабируемый шаблон для авторизации больших сайтов.

Ура,

JP

С более современными Рубинами вы можете достичь этого с prepend

module CashBalance
  attr_accessor :balance

  def deposit(amount)
    self.balance += amount
  end

  def withdraw(amount)
    self.balance -= amount
  end

  def initialize(*args)
    self.balance = 0.0
    super
  end  

end

class Bank
  prepend CashBalance

  def initialize(name)
    @name = name
  end

  def dump
    puts "%s has a balance of %0.2f" % [ @name, balance ]
  end


end


b = Bank.new("Fleet")

b.deposit(20)
b.dump
b.withdraw(10)
b.dump

доходность

$ ruby blarg.rb
Fleet has a balance of 20.00
Fleet has a balance of 10.00
Другие вопросы по тегам