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? 将导致错误,因为 usernilnil 没有 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