1

你能带我看看下面的 Ruby/Rails 行吗?

if user.role? :super_admin

为了适合我的应用程序,我将其更新为:

if user.role? :admin

那失败了,但后来我将其更新为:

if user.role? == 'admin'

它按预期工作。这是为什么?

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user

    if user.role? :super_admin
      can :manage, :all
    elsif user.role? :product_admin
      can :manage, [Product, Asset, Issue]
    elsif user.role? :product_team
      can :read, [Product, Asset]
      # manage products, assets he owns
      can :manage, Product do |product|
        product.try(:owner) == user
      end
      can :manage, Asset do |asset|
        asset.assetable.try(:owner) == user
      end
    end
  end
end



def role?(role)
    return !!self.roles.find_by_name(role.to_s.camelize)
end
4

1 回答 1

4
if user.role? :super_admin

在这一行中,您使用参数(这是一个符号role?)调用对象上的方法并检查该方法是否返回。user:super_admintrue

如果调用user.role? :admin返回 false,则可能根本没有名为“ admin ”的角色。

阅读 CanCan 关于基于角色的授权的文档应该会对这个主题有所了解。

于 2010-09-19T06:13:11.303 回答