【问题标题】:undefined method 'admin?' for #<User:0x007fccda8003c8>未定义的方法“管理员?”对于#<用户:0x007fccda8003c8>
【发布时间】:2015-07-12 19:05:16
【问题描述】:

我使用gem 'devise' 和'cancancan' 为每个用户定义多个角色。问题是当我运行 rails server 时它说undefined method admin?

在 application_controller.rb 文件中:

  before_action :configure_permitted_parameters, if: :devise_controller?
  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up)  { |u| u.permit(:roles) }
  end

在 user.rb 文件中:

  ROLES = %i[admin author]

  def roles=(roles)
    roles = [*roles].map { |r| r.to_sym }
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
  end

  def roles
    ROLES.reject do |r|
      ((roles_mask.to_i || 0) & 2**ROLES.index(r)).zero?
    end
  end

  def has_role?(role)
    roles.include?(role)
  end

在ability.rb 文件中:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end
end

有什么想法吗??

【问题讨论】:

  • 我猜你的users 表没有admin 列。请检查您的迁移是否有任何待处理或相应添加。
  • 无关,但roles = [*roles].map(&amp;:to_sym)

标签: ruby-on-rails ruby ruby-on-rails-4 devise cancancan


【解决方案1】:

您的User 模型没有admin? 方法。相反,它提供了一个has_role? 方法。所以不要写user.admin?,而是写你的ability.rb:

user.has_role?(:admin)

另一种选择是将admin? 方法添加到您的User 模型:

def admin?
  has_role?(:admin)
end

【讨论】:

    【解决方案2】:

    请添加方法管理员?给用户.rb

    def admin?
      self.roles.include?(:admin)
    end
    

    或尝试从 ability.rb 文件中调用 has_role?(:admin)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      相关资源
      最近更新 更多