设计> CanCan> Rolify错误分配的角色

时间:2012-05-31 21:07:47

标签: ruby-on-rails-3 devise cancan

好的,我已经按照github上的railsapps模板说明,在CanCan上盲目复制了ryanb的railscast(为我的事件模型换掉了Comment变量)。我已经构建了一个新用户,并为其分配了“赞助商”角色,并为管理员角色提供了一系列能力。当我在Rails中加载它时,我得到了

  

未定义的方法`角色?'对于用户:0x08 ...

好的,我在控制台中向后工作,重新将新用户分配给“赞助商”角色,看看是否有什么东西坏了。如果你低头看到最后,我看到一些似乎被打破的东西,但不确定如何解决它。这是我的能力.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

我的event.rb:

resourcify
  belongs_to :school

学校has_many eventshas_and_belongs_to_many_usersbelongs_to :event。在控制台中,我使用正确的名称,school_id,电子邮件等创建了一个new_user。这可以按预期工作。然后我:

user.add_role "sponsor"

这很有效,因为我可以看到用户ID与赞助商的角色ID对齐。下一步是我认为我的问题开始了。

ability = Ability.new(new_user)

产生以下结果:

  

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)

user_id是正确的,但“name”不是“admin”。我认为它应该拉出'赞助商'的名字?

这可能是一个简单的问题,但我猜这个错误的分配可能是我的问题的根源,为什么事件#index错误输出如上所示。似乎假设Ability.new停留在“管理员”上。我在俯视什么,比如,山姆

1 个答案:

答案 0 :(得分:2)

您正在使用错误的代码查询用户的角色。

user.role? :sponsor # wrong

使用rolify你需要这样的东西

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

尝试在没有cancan的控制台中使用简单的rolify命令

user.add_role :sponsor
user.has_role? :sponsor

这是非常正常的,Ability.new会产生一个具有管理员角色的选择查询

if user.has_role? :admin

在您的能力初始值设定项