我对如何正确配置 CanCanCan 有点困惑。
对于初学者,我是否必须添加load_and_authorize_resource
到我想限制访问的每个控制器资源?
这就是我想做的:
- 管理员可以管理和访问所有控制器和操作
- 编辑可以阅读所有,管理:新闻室,并可以管理所有帖子
- 会员可以阅读每个帖子,可以创建和更新帖子(不能编辑/删除/其他任何内容),不能访问新闻编辑室。我们的业务规则中更新和编辑帖子之间的区别在于,更新是创建一个新帖子,它是当前帖子的子帖子。所以不是编辑。只是与祖先关联的新记录。
- 访客可以阅读每个帖子,但不能创建帖子或访问新闻编辑室。
这就是我的ability.rb
样子:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
#Admin
if user.has_role? :admin
can :manage, :all
can :manage, :newsroom
# Editor
elsif user.has_role? :editor
can :read, :all
can :manage, :newsroom
can :manage, Post
#Member
elsif user.has_role? :member
can :read, :all
can :create, Post
can :status, Post
can :update, Post do |post|
post.try(:user) == user
end
#Guest
else
can :read, :all
can :create, Post
can :status, Post
end
end
end
在我的routes.rb
我有这个:
authenticate :user, lambda { |u| u.has_role? :admin or :editor } do
get 'newsroom', to: 'newsroom#index', as: "newsroom"
get 'newsroom/published', to: 'newsroom#published'
get 'newsroom/unpublished', to: 'newsroom#unpublished'
end
但发生的情况是,当我使用尚未分配任何角色的用户(即我想成为“访客”)登录时,他们可以访问新闻编辑室。
当我尝试编辑角色为 的帖子时:member
,它给了我一个“未授权编辑帖子”错误(这是正确的)。
我只是不能完全锁定Newsroom
,我不知道为什么。