1
votes

OK, I've followed the railsapps template instructions on github, slavishly copied ryanb's railscast on CanCan (swapping out Comment variable for my Event model). I've built a new user and assigned it the "Sponsor" role with a subset of abilities given to the admin role. When I load it up in Rails, I get

undefined method `role?' for User:0x08 ...

OK, I'm working my way backward within console to redo the assignment of a new user to the "sponsor" role and to see if something's broken. If you look down at the end, I see something that appears to be broken but unsure how to fix it. Here's my ability.rb

class Ability
 include CanCan::Ability

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

   if user.role? :sponsor
     can :create, Event
     can :read, Event
     can :update, Event do |event|
       event.try(:user) == user
     end
   else
     can :read, :all
   end

 end
end

My event.rb:

resourcify
  belongs_to :school

A school has_many events, has_and_belongs_to_many_users and belongs_to :event. In console, I made a new_user with the right name, school_id, email, etc. That worked as expected. I then:

user.add_role "sponsor"

That worked as I could see that the user id lined up with the role id for sponsor. The next step is where I think my problem starts.

ability = Ability.new(new_user)

That yields the following:

SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = 5 AND (((name = 'admin') AND (resource_type IS NULL)

The user_id is right but the "name" is not 'admin'. I would think it should pull the 'sponsor' name?

This may be a simple question, but I'm guessing this mis-assignment may be the root of my problem of why the events#index errors out indicated above. It seems to assume that the Ability.new is stuck on "admin." What am I overlooking, thanx, sam

1

1 Answers

2
votes

You are querying user's role with wrong code.

user.role? :sponsor # wrong

With rolify you need something like this

user.has_role? :sponsor
user.has_role? :sponsor, School
user.has_role? :sponsor, School.first

try with simple rolify commands in console without cancan

user.add_role :sponsor
user.has_role? :sponsor

this is very normal that, Ability.new yields a select query with admin role as you have

if user.has_role? :admin

in your Ability initializer