0

私はruby1.9.3とrails4.0.2とpundit0.2.1を使ったレールの初心者です

投稿モデルは次のもので構成されます。

belongs_to :user

deviseユーザーモデルはgemを使用して生成されます(および持っていませhas_many :posts

devise :database_authenticatable, :registerable,
     :rememberable, :trackable, :validatable

私はやったrake db:drop db:create db:migrateし、schema.rb今はuser_idテーブルにpostsいます。

次に、gem を使用するためにこのブログをフォローしましたpundit

そのブログに示されているのとまったく同じコードがあります。さらに、これをポストコントローラーアクションに追加しました:

def create
    @post = Post.new(params[:post].permit(:title, :text))
  authorize @post
    if @post.save
        redirect_to @post
    else
        render 'new'
    end
end

def edit
    @post = Post.find(params[:id])
  authorize @post
end

def update
    @post = Post.find(params[:id])
  authorize @post 
    if @post.update(params[:post].permit(:title, :text))
        redirect_to @post
    else
        render 'edit'
    end
end

def destroy
    @post = Post.find(params[:id])
  authorize @post
    @post.destroy

    redirect_to posts_path
end

エラーは発生していません(gemNoMethodErrorを使用したときに発生したような)。cancan

しかし、どのユーザーも、投稿の作成者でさえも、自分の投稿を編集および破棄することはできません。

それは単に示しています Couldn't find post。(これは からの警告メッセージですrescue_from Pundit::NotAuthorizedError)

ブログ投稿にあるメソッドのロジックを変更しようとしましPostPolicy ownedたが、うまくいきませんでした。

これらのモデルとスキーマを使用して、宝石を使用せずにこの単純な承認 (投稿の作成者のみが投稿を編集および削除できる必要があります) を達成するにはどうすればよいでしょうか?

ここで他の同様の質問を試しましたが、うまくいきませんでした。

私の承認が機能しているため、views具体的editにカスタマイズdestroyして投稿のリンクに苦労していますindex.html.erb

投稿の作成者のみが、投稿の編集および削除リンクを表示する必要があります。

ポリシーメソッドを使用してビューをカスタマイズするために、elabs/punditに従いました。

これが私のコードですpost_policy.rb

class PostPolicy < Struct.new(:user, :post)
  def owned
    post.user_id == user.id
  end

  def create?
    post.user_id = user.id
    new?
  end

  def new?
    true
  end

  def update?
   edit?
  end

  def edit?
    owned
  end

  def destroy?
    owned
  end
end 

そして、これは投稿のコードですindex.html.erb

<% if policy(Post).edit? %>
  <td><%= link_to 'Edit', edit_post_path(post) %></td>
<% end %>

<% if policy(Post).destroy? %>
  <td><%= link_to 'Destroy', post_path(post), method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>

elabs/pundit の専門家のドキュメントによると、との両方でメソッドをpolicy介して のインスタンスを取得できると書かれています。policyviewcontroller

私にとってそれは与えNoMethodError in Posts#indexundefined method user_id for <Class:0x22d64d8>

投稿に user_id フィールドがあります。そのuser_idを取得するためのポリシーで@postを渡す必要があると思います。他の方法を試しましたが、成功しませんでした。

4

1 に答える 1

0

質問を編集してくれた Uri に感謝します。

適切に案内してくれたアンディに感謝します。あなたが言ったように、user_id作成された新しい投稿はゼロでした。メソッドpost.user_idで現在のユーザーのIDを割り当てましたcreate

def create?
 post.user_id = user.id
 new?
end

post_policy.rb

すべての承認が正常に機能するようになりました。

しかし今、ビューのカスタマイズに使用されるポリシー メソッドに苦労しています。それに応じてコードとともに質問を編集しました。

于 2014-03-27T08:29:54.073 に答える