所以我有一个Post
模型。我的posts
可以发布也可以不发布。我正在使用Rolify,CanCanCan和Devise。
我想要发生的是我的:admin
用户,应该能够查看所有帖子的Post#Show
操作,但我的:member
或guest
用户(即非 - 记录在内)应该只能看到Post.published
个帖子。
我的ability.rb
看起来像这样:
if user.has_role? :admin
can :manage, :all
#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
我尝试为:member
和Guest
执行此操作,但它在我的Post#Index
页面上给了我一个无限的重定向循环 - 这是我的root_path
:
can :read, Post.published
其中Post.published
返回包含publication_status = "published"
的所有帖子的数组。
这就是我在Post.rb
上声明的内容:
enum publication_status: [ :unpublished, :published ]
我如何实现这一目标?
答案 0 :(得分:0)
我想出来了。
在我的Post#Show
中,我只是这样做了:
def show
if current_user and current_user.has_role? :admin or :editor
@post = Post.find(params[:id])
else
@post = Post.published.find(params[:id])
end
end
这就像一个魅力。
如果某人有更优雅的方式,请在我想知道的ability.rb
里面说。
我在ability.rb
中尝试了使用块和所有这些爵士乐的许多排列,但没有任何效果。
我还必须删除控制器中默认添加的set_post
方法,因为cancancan
已经loads_and_authorize
资源。
答案 1 :(得分:0)
尝试以下
#Member
elsif user.has_role? :member
can :read, Post, publication_status: :published
can :create, Post
can :status, Post
can :update, Post, user_id: user.id
# same goes for the Guest user
这将有效,因为publication_status
模型中有一个名为Post
的列