前提・実現したいこと
Railsを使ってプログラミングの勉強のために簡単な投稿サイトを作りたいと考えています。
その中でいいね機能を作りたくてeach文を用いて投稿がたくさん並んでいる状態から一つの投稿のidを取得してLikesテーブルに保存したいと考えています。
今、下記のコードで書いているのですが一ついいねすると下に並んでいる全ての投稿にいいねがついてしまいます。このコードではダメだということはわかっているのですがどうすればいいのかわかりません。
すみませんが皆さんの力をお借りしたいと考えています。よろしくお願いいたします。
発生している問題・エラーメッセージ
いいねのボタンを押したら下に並んでいる投稿全てにいいねがついてしまう。
該当のソースコード
HTML <div class="post-show"> <% @posts.each do |post| %> <div class="post-contents"> <%= link_to "/posts/#{@prefecture}/#{post.id}" do %> <div class="post-image"> </div> <div class="post-right-wrapper"> <div class="post-title"> <%= post.name %> </div> <div class="post-text"> <%= post.content %> </div> <div class="good-btn"> <% if Like.find_by(user_id: @current_user.id, post_id: post.id) %> <%= link_to("/likes/#{@prefecture}/destroy_index", {method: "post"}) do %> <span class="fa fa-heart like-btn-unlike"></span> <% end %> <% else %> <%= link_to("/likes/#{@prefecture}/create_index", {method: "post"}) do %> <span class="fa fa-heart like-btn"></span> <% end %> <% end %> <%= @likes_count %> </div> </div> <% end %> </div> <% end %> </div> controller def create_index @prefecture=params[:prefecture] @posts=Post.where(prefecture: params[:prefecture]) @posts.each do |post| @like=Like.new( user_id: @current_user.id, post_id: post.id ) @like.save end redirect_to("/posts/#{@prefecture}") end def destroy_index @prefecture=params[:prefecture] @posts=Post.where(prefecture: params[:prefecture]) @posts.each do |post| @like = Like.find_by(user_id: @current_user.id, post_id: post.id) @like.destroy end redirect_to("/posts/#{@prefecture}") end rails routesの結果 rails routes Prefix Verb URI Pattern Controller#Action GET / home#top posts_new GET /posts/new(.:format) posts#new posts_create POST /posts/create(.:format) posts#create GET /posts/:prefecture(.:format) posts#index GET /posts/:prefecture/:id(.:format) posts#show users_create POST /users/create(.:format) users#create users_login POST /users/login(.:format) users#login users_logout POST /users/logout(.:format) users#logout GET /users/:id(.:format) users#show POST /likes/:prefecture/:post_id/create(.:format) likes#create POST /likes/:prefecture/:post_id/destroy(.:format) likes#destroy POST /likes/:prefecture/create_index(.:format) likes#create_index POST /likes/:prefecture/destroy_index(.:format) likes#destroy_index rails_service_blob GET /rails/active_storage/blobs/:signed_id/*filename(.:format) active_storage/blobs#show rails_blob_representation GET /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show rails_disk_service GET /rails/active_storage/disk/:encoded_key/*filename(.:format) active_storage/disk#show update_rails_disk_service PUT /rails/active_storage/disk/:encoded_token(.:format) active_storage/disk#update rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format) active_storage/direct_uploads#create routes.rb Rails.application.routes.draw do get '/' =>"home#top" # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html get 'posts/new' =>"posts#new" post 'posts/create' => "posts#create" get 'posts/:prefecture' =>"posts#index" get 'posts/:prefecture/:id' => "posts#show" post 'users/create'=>"users#create" post 'users/login' =>"users#login" post 'users/logout' => "users#logout" get 'users/:id' =>"users#show" post 'likes/:prefecture/:post_id/create' =>"likes#create" post 'likes/:prefecture/:post_id/destroy' =>"likes#destroy" post 'likes/:prefecture/create_index' =>"likes#create_index" post 'likes/:prefecture/destroy_index' =>"likes#destroy_index" end
試したこと
each.with_indexを用いてみたり、pluckを用いてみたりしましたが自分でもしっくりこず、できませんでした
補足情報(FW/ツールのバージョンなど)
作りたいサイトは観光スポットなどを写真などの情報を加えて投稿するサイトです。
自分が知らない知識で簡単に解決しそうなのですがどうやればいいのかわからないので教えていただきたいです
モデルの関連を追記お願いします。
likeモデルの使い方を間違えているような気がします。
さっそくのご対応ありがとうございます。
モデルの追記ということで
Postsモデルのcolumnは
prefecture(:string)(値は県名がそれぞれ入っている。)
name(:string)(観光スポットの名称など)
他にもありますがPostsモデルはこんな感じです。
Likesモデルのcolumnは
user_id(:integer)(ここに@current_user.idを取得させる)
post_id(:integer)(ここにeachで並んだ投稿の一つのidを取得させたい)
の二つです。
Usersモデルは
user_name(:string)(ユーザー名)
email(:string)(メールアドレス)
が入っています。
ログインしているユーザーのデータが@current_userに入っています。
上のコードではURLにpost.idがありますが、投稿一覧には各県の観光スポットの一覧を並ばせたいので/likes/#{@prefecture}/create_indexとしてlikeコントローラのcreate_indexアクションとしてできればと思います。
あまりにも初心者なので、いただいた追記の以来にしっかりと回答できているか不安ですので、足りない情報があればお手数ですがまた追記修正依頼をしていただければとおもます。
すみませんがよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー