ruby-on-rails - Ruby on Rails - 未定义方法 `admin?' for nil :NilClass

标签 ruby-on-rails ruby devise cancancan

我使用 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? 行将导致错误,因为 usernil 并且 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/

相关文章:

ruby-on-rails - Rails 3 : Retrieve all child records where parent model attribute equals search key

ruby-on-rails - 用于跟踪用户事件的 Gem

mysql - 在 ruby​​ 中运行 rake import 任务时内存不足

ruby-on-rails - 如何禁用特定邮件程序的布局?

ruby-on-rails - Net::SSH 从生产 rails 控制台工作,从生产 webapp 工作 AuthenticationFailed

ruby - 检查字符串是否包含 Ruby 中的特定字符序列

ruby - 如何使用负索引到正索引进行字符串索引?

ruby-on-rails - Rails Devise 用户帮助

ruby-on-rails - 使用 Devise Gem 自定义密码保存

ruby-on-rails - Rails 设计 - Facebook + Twitter +