好的,我已经按照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 events
,has_and_belongs_to_many_users
和belongs_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停留在“管理员”上。我在俯视什么,比如,山姆
答案 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
在您的能力初始值设定项
中