我使用 gem 'devise'
和 'cancancan'
来定义用户角色。问题是当我运行 Rails 服务器时,它说: undefined method 'admin?'对于 nil:NilClass
能力.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
可能是什么问题?
最佳答案
我猜测错误产生的行类似于:
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
Ruby 中的 try
不会抛出错误,但如果该方法不存在,则会返回 nil
。
(我还没有对此进行测试,并且由于您没有分享错误,所以我在响应中采取了一些自由的态度。)
我还想指出,如果您的 User
模型上的 admin
属性是 bool 值,则无需定义此方法 - Rails 可以自动为您服务。
def admin?
self.admin
end
关于ruby-on-rails - Ruby on Rails - 未定义方法 `admin?' for nil :NilClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44027632/