Канкан способности в отдельном файле
Можно ли определить способности в отдельном файле и включить их в файл 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