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
的列,这将起作用