0

だから私はPostモデルを持っています。Mypostsは公開または非公開のいずれかです。私はRolify、CanCanCan、およびDeviseを使用しています。

私が望んでいるのは、ユーザーがすべての投稿のアクション:adminを表示できるようにすることですが、私またはユーザー (つまり、ログインしていない) は投稿のみを表示できるようにする必要があります。Post#Show:memberguestPost.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

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があるため、コントローラーに追加されたデフォルトのメソッドを削除する必要がありました。cancancanloads_and_authorize

于 2014-11-03T12:17:45.913 に答える