我正在使用gem 'devise'
和'cancancan'
来定义用户的角色。问题是,当我运行rails服务器时,它说:undefined method 'admin?' for nil:NilClass
ability.rb:
class Ability
include CanCan::Ability
def initialize(user)
if user.admin?
can :manage, :all
else
can :read, :all
end
end
end
用户模型:
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :projects
def admin?
self.admin
end
end
可能是什么问题?
答案 0 :(得分:2)
我猜测错误来源的行是这样的:
if can? :manage, @object
# ...
这可能会导致错误,因为您的用户未登录。
定义能力的方法如下所示:
def initialize(user)
if user.admin?
can :manage, :all
else
can :read, :all
end
end
因此,如果您没有用户,则行user.admin?
会导致错误,因为user
为nil
且nil
没有admin?
方法。< / p>
我会做这样的事情:
def initialize(user)
if user.try(:admin?)
can :manage, :all
else
can :read, :all
end
end
Ruby中的 try
不会抛出错误,但如果该方法不存在,则会返回nil
。
(我没有对此进行测试,因为您没有分享错误,我在回复中采取了一些自由。)
我还想指出,如果admin
模型上的User
属性是布尔值,则不需要定义此方法 - Rails会自动执行此操作对你而言。
def admin?
self.admin
end
答案 1 :(得分:0)
<强>能力强>
class Ability
include CanCan::Ability
def initialize(user)
if user.has_role? :admin
can :manage, :all
else
can :read, :all
end
end
end