Ruby on Rail - 未定义的方法`admin?'为零:NilClass

时间:2017-05-17 14:25:40

标签: ruby-on-rails ruby devise cancancan

我正在使用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

可能是什么问题?

2 个答案:

答案 0 :(得分:2)

我猜测错误来源的行是这样的:

if can? :manage, @object
  # ...

这可能会导致错误,因为您的用户未登录。

定义能力的方法如下所示:

def initialize(user)
  if user.admin?
    can :manage, :all
  else
    can :read, :all
  end
end

因此,如果您没有用户,则行user.admin?会导致错误,因为usernilnil没有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