質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

2124閲覧

Railsでeach文で並んだ投稿のidを一つ取得したい

Takashi1019

総合スコア4

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/08/18 09:27

編集2020/08/22 02:31

前提・実現したいこと

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/ツールのバージョンなど)

作りたいサイトは観光スポットなどを写真などの情報を加えて投稿するサイトです。
自分が知らない知識で簡単に解決しそうなのですがどうやればいいのかわからないので教えていただきたいです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nasuk47

2020/08/18 09:50

モデルの関連を追記お願いします。 likeモデルの使い方を間違えているような気がします。
Takashi1019

2020/08/19 04:49

さっそくのご対応ありがとうございます。 モデルの追記ということで 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アクションとしてできればと思います。 あまりにも初心者なので、いただいた追記の以来にしっかりと回答できているか不安ですので、足りない情報があればお手数ですがまた追記修正依頼をしていただければとおもます。 すみませんがよろしくお願いします。
guest

回答2

0

一度こちらの記事を読んでから実装し直した方がスムーズに実装できると思います。
いいねを押した時にlikescontrollerのcreateアクションが実行されるように実装するように実装した方がいいと思います。
rails いいね機能の実装

投稿2020/08/19 08:19

nasuk47

総合スコア311

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

@posts=Post.where(prefecture: params[:prefecture]) @posts.each do |post|

と県の全Postについてeachしているからです
link_to("/likes/#{@prefecture}/#{post.id}/create_index", とpost.idが(多分)params[:id]で渡ってきてますから
@post = Post.find_by(id: params[:id]) な @postについて likeしてください。

投稿2020/08/18 22:28

winterboum

総合スコア23347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Takashi1019

2020/08/19 04:57

回答いただきありがとうございます。 申し訳ないのですが上記のコードでは自分の書き方が間違えており、 HTMLのif文の中では <%= link_to("/likes/#{@prefecture}/#{post.id}/destroy_index", {method: "post"}) do %> となっていてURL部分にpost.idがあるかのように思えますが投稿一覧のページ(URLは/posts/:prefecture)から直接いいねしたいのでparams[:id]で取得することができません。 もしよろしければ別の方法も教えていただけるとありがたいです。
winterboum

2020/08/19 05:23

正しいcodeを載せてください
Takashi1019

2020/08/19 05:36

申し訳ありません、 正しいcodeに編集させていただきました
winterboum

2020/08/19 05:48

これでは無理ですね。その県のどのpostについてなのかの情報が渡りませんから。 "/likes/#{@prefecture}/create_index" は routesではどう定義し、どういうpath名になってますか? 仮に create_index_likes_prefecture_path だとして link_to create_index_likes_prefecture_path(@prefecture,post_id: post.id) ,method: :post ってすると params[:post_id] がわたります
Takashi1019

2020/08/19 07:35

routesでは post 'likes/:prefecture/create_index' =>"likes#create_index" と書いていてcreate_indexアクションは上記の通りです。 カッコの表記(@prefecture,post_id: post.id)はクリックした各投稿のidをpost_idに入れてくれるものなのでしょうか。
winterboum

2020/08/19 09:20

rails routes して likes/:prefecture/create_index が何と言うb名前になっているか確認してください。 >各投稿のidをpost_idに入れてくれるものなのでしょうか。 です
Takashi1019

2020/08/21 05:48

rails routesした結果を下に貼ります。likes/:prefecture/create_indexには特に書いてないのですがこれは何故なのでしょうか 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
winterboum

2020/08/21 06:40

rails routes の結果が欲しい それと nasuk47さんの助言も検討して
Takashi1019

2020/08/21 07:21

何度もすみません、、どうしても解決したくて rails routesの結果というのは ターミナルで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 >>それと nasuk47さんの助言も検討して nasuke47さんからの助言も当然検討させていただきますがいただいたサイトでは投稿詳細からいいねする方法が書いてあり、その方法を参考にさせていただきました。 よろしくお願いいたします
winterboum

2020/08/21 08:27

はて、、見慣れているのと違うな。 インデントがなくなってるのでわかりにくいです。質問欄に<code>つかって書いて
Takashi1019

2020/08/21 08:55

質問欄に書かせていただきました。 よろしくお願いします。
winterboum

2020/08/21 09:24

はて、、、 POST /likes/:prefecture/create_index がなぜ  posts_create POST /posts/create(.:format) の様にならないのだろう。。。 routes.rb 見せて
Takashi1019

2020/08/22 02:31

同じくroutes.rbも質問欄に書かせていただきました。 お願いします。
winterboum

2020/08/22 12:00

なぜこれでpathができないのか??ですが仕方ない post 'likes/:prefecture/create_index' =>"likes#create_index",as: 'create_index_likes_prefecture' として(もっと簡単でもよいです) link_to( create_index_likes_prefecture_path(@prefecture,post_id: post.id), {method: "post"}) とすると params[:post_id] が得られます
Takashi1019

2020/08/24 09:44

返信が遅くなってしまい申し訳ありません。 教えていただいた通りにしたら完璧に解決しました。 しつこかったとは思いますが最後までお付き合いいただきありがとうございました。 とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問