未定义的方法'admin?'对于#<user:0x007fccda8003c8>

时间:2015-07-12 19:05:17

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

我使用gem 'devise''cancancan'来定义每个用户的多个角色。问题是当我运行rails服务器时它说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

任何想法?

2 个答案:

答案 0 :(得分:2)

您的User模型没有admin?方法。相反,它提供了has_role?方法。因此,而不是user.admin?写入ability.rb

user.has_role?(:admin)

另一个选项是为admin?模型添加User方法:

def admin?
  has_role?(:admin)
end

答案 1 :(得分:1)

请添加方法管理员?到user.rb

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

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