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

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

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

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

Q&A

解決済

1回答

814閲覧

いいねボタンに問題があり、投稿一覧が表示されない

spring_dexcter

総合スコア13

Ruby on Rails

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

0グッド

0クリップ

投稿2021/01/09 13:23

編集2021/01/10 04:31

エラーメッセージ

イメージ説明

Started GET "/talks" at 2021-01-10 13:28:32 +0900 Processing by TalksController#index as HTML Rendering talks/index.html.slim within layouts/application Talk Load (5.9ms) SELECT "talks".* FROM "talks" ORDER BY "talks"."created_at" DESC ↳ app/views/talks/index.html.slim:9 User Load (3.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]] ↳ app/views/talks/index.html.slim:13 User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] ↳ app/helpers/sessions_helper.rb:20:in `current_user' User Exists? (4.6ms) SELECT 1 AS one FROM "users" INNER JOIN "likes" ON "users"."id" = "likes"."user_id" WHERE "likes"."talk_id" = $1 AND "users"."id" = $2 LIMIT $3 [["talk_id", 17], ["id", 1], ["LIMIT", 1]] ↳ app/models/talk.rb:16:in `like?' Rendered talks/index.html.slim within layouts/application Completed 500 Internal Server Error in 69ms

詳細画面は正常に動きます。

環境

rails 6.0.2 ubuntu (wsl)

該当ソースコード

routes.rb

ruby

1 resources :talks do 2 resources :likes, only: %i(create destroy) 3 resources :comments 4 end 5 6--------------------------------------------------- 7 talk_likes POST /talks/:talk_id/likes(.:format) likes#create 8 talk_like DELETE /talks/:talk_id/likes/:id(.:format) likes#destroy

talks_controller.rb

ruby

1 def index 2 unless params[:q].blank? 3 split_keyword = params[:q][:content_cont].split(/\p{blank}/) 4 end 5 @q = Talk.ransack(content_cont_any: split_keyword) 6 @talks = @q.result.recent 7 end

likes_controlle.rb

ruby

1 def create 2 @like = current_user.likes.build(talk_id: params[:talk_id]) 3 @like.save 4 redirect_back(fallback_location: root_path) 5 end 6 7 def destroy 8 @like = Like.find_by(talk_id: params[:talk_id], user_id: current_user.id) 9 @like.destroy 10 redirect_back(fallback_location: root_path) 11 end

talks/index.html.slim

slim

1- @talks.each do |talk| 2 .card.mx-auto.talk-card 3 .card-body 4 ・・・省略 5 .card-text 6 = link_to simple_format(h(talk.content), {}, sanitize: false, wrapper_tag: "div"), talk 7 .row.button-area 8 = link_to talk, class: "btn-gradient-radius" 9 i.far.fa-comment 10 span コメント 11 - if talk.like?(current_user) 12 = link_to "##", talk_like_path(talk), method: :delete 13 - else 14 = link_to "#", talk_likes_path(talk), method: :post 15

talk.rb

belongs_to :user has_many :likes, dependent: :destroy has_many :liked_users, through: :likes, source: :user validates :user_id, presence: true validates :content, presence: true acts_as_taggable scope :recent, -> { order(created_at: "DESC") } def like?(user) liked_users.include?(user) end

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

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

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

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

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

guest

回答1

0

ベストアンサー

link_to "##", talk_like_path(talk), method: :delete

link_to "##", talk_like_path(talk,like), method: :delete

それでうまくいかなかったら、modelのcode載せてください。

追記
ああ、app/models/talk.rb:16 でエラーになっているわけではなさそうですね。
すると
- if talk.like?(current_user) = link_to "##", talk_like_path(talk), method: :delete - else = link_to "#", talk_likes_path(talk), method: :post
のどちらかの link_toが怪しいです。 postの方は問題ないですが、deleteの方ですね。
talk には沢山 likeがつくので、そのどのlikeなのか、がきちんと伝わっていないでことですね。
talk_like_path(talk,like)と回答しましたがそこが問題だ。
likeを特定する必要があります。
def like?(user) を直して、userがpostしたlikeを返すようにしましょう。
liked_users.find{|linke_user| liked_user.user_id == user.id }&.like
でしょうか。
method名とそぐわないから改名するのがよいかも。
で、
- if (like = talk.like?(current_user))

投稿2021/01/09 14:07

編集2021/01/10 05:06
winterboum

総合スコア23567

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

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

spring_dexcter

2021/01/10 04:24 編集

ご回答ありがとうございます。 talk_like_path(talk, like)でも上手く動きませんでした。
winterboum

2021/01/10 03:01

いかん、勘違いを読んでた。ただその修正は必要です。 で、 エラーメッセージはもう少し前からありませんか? プログラムはコメントでなく質問本文に書いてください
spring_dexcter

2021/01/10 04:32

エラーメッセージ追加しました。 すいません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問