这是关于 Rails 4: CanCanCan abilities with has_many :through association 的后续问题,我在这里重述问题,因为我认为上下文稍有变化,经过4次更新后,初始问题的代码很漂亮也不同。
我还检查了其他问题,例如 Undefined method 'role?' for User ,但它没有解决我的问题。
所以,我们走了:我有三个模型:
class User < ActiveRecord::Base
has_many :administrations
has_many :calendars, through: :administrations
end
class Calendar < ActiveRecord::Base
has_many :administrations
has_many :users, through: :administrations
end
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
end
对于给定的calendar
,user
有一个role
,它在administration
联接模型中定义(在名为role
的列中)。
对于每个calendar
,user
只能包含以下三个role
中的一个:所有者,编辑者或查看者。
这些角色目前不存储在字典或常量中,仅作为字符串分配给administration
(&#34; Ower&#34;,&#34;编辑&#34;,&#34 ;观察者&#34;)通过不同的方法。
User
模型上的身份验证是通过Devise
处理的,current_user
方法正在运行。
为了仅允许登录的user
访问应用内资源,我已在before_action :authenticate_user!
和calendars
控制器中添加了administrations
方法。
现在,我需要实现一个基于角色的授权系统,所以我刚刚安装了CanCanCan
gem。
这是我想要实现的目标:
user
可以create
新calendar
s。user
是owner
的{{1}},那么他可以calendar
manage
以及属于calendar
的所有administration
对此calendar
,包括他自己的administration
。user
是editor
的{{1}},那么他可以calendar
和read
这个update
和{{1}他的calendar
。destroy
是administration
的{{1}},那么他user
viewer
和calendar
read
calendar
destroy
}。为了实现上述目标,我提出了以下administration
文件:
ability.rb
现在,当登录并尝试访问任何日历页面(索引,显示,编辑)时,我收到以下错误:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.role?(:owner)
can :manage, Calendar, :user_id => user.id
can :manage, Administration, :user_id => user.id
can :manage, Administration, :calendar_id => calendar.id
elsif user.role?(:editor)
can [:read, :update], Calendar, :user_id => user.id
can :destroy, Administration, :user_id => user.id
elsif user.role?(:viewer)
can [:read], Calendar, :user_id => user.id
can :destroy, Administration, :user_id => user.id
end
end
end
我想问题来自于NoMethodError in CalendarsController#show
undefined method `role?' for #<User:0x007fd003dff860>
def initialize(user)
user ||= User.new
if user.role?(:owner)
can :manage, Calendar, :user_id => user.id
can :manage, Administration, :user_id => user.id
can :manage, Administration, :calendar_id => calendar.id
本身没有user
,但只为给定的role
定义role
。< / p>
这解释了为什么我在calendar
上获得NoMethodError
role?
的原因。
所以,问题是:如何检查给定user
的{{1}} user
?
知道如何让事情发挥作用吗?
答案 0 :(得分:2)
您应该在用户模型中使用role?
方法,如下所示 -
class User < ActiveRecord::Base
has_many :administrations
has_many :calendars, through: :administrations
def role?(type)
administrations.pluck(:role).include?(type.to_s)
end
end