Ruby on Rails 处理大量能力
示例
一旦能力定义的数量开始增加,处理能力文件就变得越来越困难。
按照以下示例,处理这些问题的第一个策略是将能力转移到有意义的方法中:
class Ability
include CanCan::Ability
def initialize(user)
anyone_abilities
if user
if user.admin?
admin_abilities
else
authenticated_abilities
end
else
guest_abilities
end
end
private
def anyone_abilities
#为每个人定义能力,包括登录用户和访问者
end
def guest_abilities
#为访客定义能力
end
def authenticated_abilities
#仅为登录用户定义功能
end
def admin_abilities
#仅为管理员定义功能
end
end一旦此类足够大,您可以尝试将其分为不同的类以处理不同的职责,如下所示:
#app/models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
self.mergeAbilities::Everyone.new(user)
if user
if user.admin?
self.mergeAbilities::Admin.new(user)
else
self.mergeAbilities::Authenticated.new(user)
end
else
self.mergeAbilities::Guest.new(user)
end
end
end然后将这些类定义为:
#应用/模型/功能/guest.rb
module Abilities
class Guest
include CanCan::Ability
def initialize(user)
#仅适用于匿名访问者的能力
end
end
end等等Abilities::Authenticated,Abilities::Admin或其他。