如何仅针对具有特定角色的用户限制特定范围?

时间:2014-11-02 10:35:21

标签: ruby-on-rails-4 devise cancan rolify cancancan

所以我有一个Post模型。我的posts可以发布也可以不发布。我正在使用Rolify,CanCanCan和Devise。

我想要发生的是我的:admin用户,应该能够查看所有帖子的Post#Show操作,但我的:memberguest用户(即非 - 记录在内)应该只能看到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

我尝试为:memberGuest执行此操作,但它在我的Post#Index页面上给了我一个无限的重定向循环 - 这是我的root_path

    can :read, Post.published

其中Post.published返回包含publication_status = "published"的所有帖子的数组。

这就是我在Post.rb上声明的内容:

enum publication_status: [ :unpublished, :published ]

我如何实现这一目标?

2 个答案:

答案 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的列