0

所以我有一个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

WherePost.published返回所有带有publication_status = "published".

这就是我在我的Post.rb

enum publication_status: [ :unpublished, :published ]

我如何实现这一目标?

4

2 回答 2

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是资源。

于 2014-11-03T12:17:45.913 回答
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模型中命名的列,这将起作用

于 2014-11-09T06:34:17.963 回答