0

いいねボタン用のフォームを作成しようとしています。このようなモデルは、さまざまなタイプのモデル (コメント / 投稿 / など) にポリモーフィックであり、特定のユーザーに属します。

たとえば、このユーザーがブログ アイテムを表示しているときに、投稿の下に「いいね」ボタンを表示したいと考えています。同様のルートが常に目的のポリモーフィック オブジェクト内にネストされるように、ルートを設定しました。

たとえば、投稿の場合:

#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

4

2 に答える 2

1

実際のフォームを使用する必要はありません。link_to を使用して実行できます。基本的なテキストリンクの例を次に示します(機能していることを確認するため)

- if not @post.is_liked_by current_user
  = link_to 'Like', post_like_path(@post), method: :post
- else
  = link_to 'Delete', post_like_path([@post, @post.likes.find_by(user_id: current_user.id)]), method: :delete

次に、画像/ボタンをリンク自体として使用します。

- if not @post.is_liked_by current_user
  = link_to post_like_path(@post), method: :post do
    # some html image/button
- else
  = link_to post_like_path([@post, @post.likes.find_by(user_id: current_user.id)]), method: :delete do
    # some html image/button

受け入れられた回答の助けを借りてこのコードを更新し、将来見ている人は誰でも link_to を使用できるようにしました。

于 2015-10-02T13:41:57.840 に答える