Ruby on Rail - 未定义方法“admin?” nil:NilClass
Ruby on Rail - undefined method `admin?' for nil:NilClass
我正在使用 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
可能是什么问题?
能力
class Ability
include CanCan::Ability
def initialize(user)
if user.has_role? :admin
can :manage, :all
else
can :read, :all
end
end
end
我猜错误起源的那一行是这样的:
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?
方法.
我会这样做:
def initialize(user)
if user.try(:admin?)
can :manage, :all
else
can :read, :all
end
end
try
in Ruby 不会抛出错误,但会 return nil
如果方法不存在。
(我没有对此进行测试,并且由于您没有分享错误,我在回复中采取了一些自由。)
我还想指出,如果 User
模型上的 admin
属性是布尔值,则不需要定义此方法——Rails自动为您服务。
def admin?
self.admin
end
我正在使用 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
可能是什么问题?
能力
class Ability
include CanCan::Ability
def initialize(user)
if user.has_role? :admin
can :manage, :all
else
can :read, :all
end
end
end
我猜错误起源的那一行是这样的:
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?
方法.
我会这样做:
def initialize(user)
if user.try(:admin?)
can :manage, :all
else
can :read, :all
end
end
try
in Ruby 不会抛出错误,但会 return nil
如果方法不存在。
(我没有对此进行测试,并且由于您没有分享错误,我在回复中采取了一些自由。)
我还想指出,如果 User
模型上的 admin
属性是布尔值,则不需要定义此方法——Rails自动为您服务。
def admin?
self.admin
end