Ruby on rails 4 如何将特定范围仅限于具有特定角色的用户?
所以我有一个Ruby on rails 4 如何将特定范围仅限于具有特定角色的用户?,ruby-on-rails-4,devise,cancan,rolify,cancancan,Ruby On Rails 4,Devise,Cancan,Rolify,Cancancan,所以我有一个Post模型。我的帖子可以发布也可以取消发布。我正在使用Rolify、CanCanCan和design 我想要的是我的:admin用户,应该能够查看所有帖子的Post#Show操作,但是我的:member或guest用户(即未登录)应该只能查看Post.发布的帖子 我的能力.rb如下所示: if user.has_role? :admin can :manage, :all #Member elsif user.has_role? :member
Post
模型。我的帖子可以发布也可以取消发布。我正在使用Rolify、CanCanCan和design
我想要的是我的:admin
用户,应该能够查看所有帖子的Post#Show
操作,但是我的:member
或guest
用户(即未登录)应该只能查看Post.发布的帖子
我的能力.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
页面上给了我一个无休止的重定向循环-这是我的根路径
:
can :read, Post.published
其中Post.published
返回包含publication\u status=“published”
的所有帖子的数组
这就是我在我的Post.rb
上声明的方式:
enum publication_status: [ :unpublished, :published ]
我怎样才能做到这一点呢?我想出来了
在我的帖子#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
这很有魅力
如果有人有更优雅的方式,可以在能力.rb中说,我很想知道
我在ability.rb中尝试了许多使用块和所有这些jazz的排列,但是没有任何效果
我还必须删除控制器中默认添加的set\u post
方法,因为cancancan
已经加载并授权了资源。尝试以下操作
#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
如果您在Post
模型中有一个名为publication\u status
的列,这将起作用