いいねボタン用のフォームを作成しようとしています。このようなモデルは、さまざまなタイプのモデル (コメント / 投稿 / など) にポリモーフィックであり、特定のユーザーに属します。
たとえば、このユーザーがブログ アイテムを表示しているときに、投稿の下に「いいね」ボタンを表示したいと考えています。同様のルートが常に目的のポリモーフィック オブジェクト内にネストされるように、ルートを設定しました。
たとえば、投稿の場合:
#routes.rb
resources :posts do
resources :likes, only: [:create, :destroy]
end
したがって、投稿リンクは次のようになります/posts/:post_id/likes/
(method: Post)
コントローラーで新しい Like オブジェクトを作成し、それをユーザーに割り当てて保存します。これは完全に機能します。
問題は、削除フォームを作成しようとしているときです。リンクを作成する方法がわかりません/posts/:post_id/like/:id
(方法: 削除)。ただし、このように構成するとエラーが発生します。
フォームもリファクタリングできると思いますが、この種の「複雑な」関係のフォームを作成する方法についてはわかりません。
#shared/_like_button.html.haml
- if not @post.is_liked_by current_user
= form_for(@post.likes.build, url: post_likes_path(@post)) do |f|
= f.submit
- else
= form_for(@post.likes.find_by(user_id: current_user.id), url: post_like_path(@post), html: {method: :delete}) do |f|
= f.submit
主な問題は、そのようなpost_like_path(@post)
ことを認識していないため、正しくレンダリングされないことだと思います:id
。そのため、リンクを作成しようとするとエラーが発生しActionController::UrlGenerationError
続けます。PostsController#show