私はruby
1.9.3とrails
4.0.2とpundit
0.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
介して のインスタンスを取得できると書かれています。policy
view
controller
私にとってそれは与えNoMethodError in Posts#index
、undefined method user_id for <Class:0x22d64d8>
投稿に user_id フィールドがあります。そのuser_idを取得するためのポリシーで@postを渡す必要があると思います。他の方法を試しましたが、成功しませんでした。