我们有一个用户界面,可让管理员更改我们用户的权限。所以我们将这些权限存储在数据库中。
我们的能力等级是:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user
if user.role? :super_admin
can :manage, :all
else
if user.role? :live_trader
can :admin, LiveEvent
end
if user.role? :horse_trader
can :horse_admin, Event
end
if user.role? :channel_admin
can :manage, Channel
end
if user.role? :device_admin
can :manage, Device
end
if user.role? :ost
can :read, Customer.first
end
can do |action, subject_class, subject|
user.roles.find_all_by_action(aliases_for_action(action)).any? do |role|
role.authorizable_type == subject_class.to_s &&
(subject.nil? || role.authorizable_id.nil? || role.authorizable_id == subject.id)
end
end
# can always manage ourselves
can :manage, user
end
end
end
它工作正常,但我们不能使用accessible_by。我们得到:
The accessible_by call cannot be used with a block 'can' definition.
我没有看到任何其他限制结果集的方法......这是一个错误还是我们做错了?
答案 0 :(得分:2)
错误消息说明了一切,真的。
使用数据库权限使用cancan的方法有两种。一个使用'can'块,另一个使用显式'can'权限。他们实现了同样的目标。
您可以查看https://github.com/ryanb/cancan/wiki/Abilities-in-Database以查看两个示例。
我想说你想要将'can'块重写为:
user.roles.each do |role|
if permission.subject_id.nil?
can permission.action.to_sym, role.authorizable_type.constantize
else
can permission.action.to_sym, role.authorizable_type.constantize, :id => role.authorizable_id
end
end
HTH。