cancan:在数据库中存储vs accessible_by?

时间:2011-08-23 09:36:27

标签: ruby-on-rails cancan

我们有一个用户界面,可让管理员更改我们用户的权限。所以我们将这些权限存储在数据库中。

我们的能力等级是:

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.

我没有看到任何其他限制结果集的方法......这是一个错误还是我们做错了?

1 个答案:

答案 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。