我目前卡在了如何根据我们想要的每个条件为CanCan分离角色上。在我们的应用程序中,有许多类别(例如数学、英语、历史等),每个类别中都有许多课程。
每个用户可以在每个类别中拥有许多不同的角色。例如,约翰可以是数学的“读者”,这意味着他可以阅读所有在数学中的课程。约翰还可以成为英语的“作者”,这意味着他可以阅读英语中的所有课程,在英语类别内创建一个课程,并仅编辑/删除他在英语中创建的课程。
如果这些是约翰唯一拥有的角色,则他将无法在导航栏中看到历史类别,并且将被拒绝访问在历史类别中的课程。
以下是关系设置方式:
class User < ActiveRecord::Base
has_many :roles
def has_role?(role_sym)
roles.any? { |r| r.level.underscore.to_sym == role_sym }
end
end
class Category < ActiveRecord::Base
has_many :roles
has_many :courses
end
class Role < ActiveRecord::Base
belongs_to :user
belongs_to :category
attr_accessible :level, :category_id, :user_id
end
在 model/ability.rb 文件中,我们有以下内容:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in) #guest
if user.has_role? :reader
reader(user)
end
if user.has_role? :writer
writer(user)
end
end
#BE ABLE TO SEE COURSES AND CATS FOR PERMITTED CATS.
def reader(user)
can :read, Category, :roles => { :user_id => user.id, :level => "reader" }
## how would we be able to limit reading of courses that are within permitted categories? something like category.courses ~~
end
def writer(user)
reader(user) #inheriting from reader? this doesnt work because level is hardcoded into reader
can :read, Category, :roles => { :user_id => user.id, :level => "writer"}
# 1.you can read all courses in category that you are given permission to
# 2.you can write courses in permitted category
# 3.you can edit, delete courses that only youve created within permitted category
end
end
问题:
如何正确分离“读者”和“作者”的角色?如何访问我们有权限访问的某个分类下的课程?
在ability.rb中定义了读者和作者方法后,如何在视图页面中使用它们?当前文档似乎使用类似 "<% if can? :read, @category %> " 的方式,但这并没有使用我们分离和定义的方法。
p.s. 我们将有7种不同的角色:访客、读者、作者、编辑、管理员、超级管理员和应用程序管理员(开发人员)
我已经尝试解决这个问题3天了 - 请理解我还是一个初学者!提前感谢