Mezbah
Mezbah

Reputation: 1267

undefined method 'admin?' for #<User:0x007fccda8003c8>

I am using gem 'devise' and 'cancancan' for defining many roles per user. problem is when I run rails server its says undefined method admin?

in application_controller.rb file:

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

in user.rb file :

  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

in ability.rb file :

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

any idea ??

Upvotes: 1

Views: 3507

Answers (2)

Athar
Athar

Reputation: 3268

Please add method admin? to the user.rb

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

or try to call has_role?(:admin) from the ability.rb file.

Upvotes: 1

spickermann
spickermann

Reputation: 106872

Your User model doesn't have an admin? method. Instead it provides a has_role? method. So instead of user.admin? write in your ability.rb:

user.has_role?(:admin)

An other option is add an admin? method to your User model:

def admin?
  has_role?(:admin)
end

Upvotes: 2

Related Questions