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

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

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

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

Q&A

解決済

1回答

645閲覧

Ruby On Rails いいね機能実装にて「いいね」した値がDBに保存されない

frusciante

総合スコア8

Ruby on Rails

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

0グッド

2クリップ

投稿2020/01/27 08:52

編集2020/01/27 11:16

前提・実現したいこと

初めて質問を投稿させていただきます。よろしくお願いいたします。
現在、Ruby On Railsでメッセージ投稿アプリを開発しており、いいね機能を実装したいです。

下記リンクのキャプチャのように、いいねボタンが押された際に、「いいね件数:〇〇件」で件数を表示させたいです。
viewキャプチャ

恐縮ですが、ご助言いただけますと幸いでございます。
よろしくお願いいたします。

発生している問題・エラーメッセージ

現状、いいねボタンを押した後、DBのいいね用テーブルにユーザー(user_id)と投稿(message_id)の値が保存されない状況です。

該当のソースコード

  • likes_controller.rb
class LikesController < ApplicationController def create @like = current_user.likes.create(message_id: params[:message_id]) redirect_back(fallback_location: root_path) end def destroy @like = Like.find_by(message_id: params[:message_id], user_id: current_user.id) @like.destroy redirect_back(fallback_location: root_path) end end
  • messages_controller.rb
class MessagesController < ApplicationController def index @message = Message.new @messages = Message.all.order("created_at DESC") end def new end def create @post = Message.create(message_params) respond_to do |format| format.html { redirect_to root_path } format.json end end def edit @post_edit = Message.find_by(id: params[:id]) end def show @message = Message.find(params[:id]) @like = Like.new end def update @post_edit = Message.find_by(id: params[:id]) @post_edit.update(message_params) flash[:notice] = "投稿を編集しました" redirect_to root_path end def destroy message = Message.find(params[:id]) message.destroy flash[:notice] = "投稿を削除しました" redirect_to root_path end private def message_params params.require(:message).permit(:text).merge(user_id: current_user.id) end end
  • message.rb
class Message < ApplicationRecord belongs_to :user has_many :likes validates :text, presence: true has_many :liked_users, through: :likes, source: :user end
  • like.rb
class Like < ApplicationRecord belongs_to :user belongs_to :message validates_uniqueness_of :message_id, scope: :user_id end
  • user.rb
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :messages has_many :likes has_many :liked_messages, through: :likes, source: :message def already_liked?(message) self.likes.exists?(message_id: message.id) end end
  • _impressions.html.haml

haml

1- @messages.each do |message| 2 %li.messagePost 3 .messagePost__userName 4 = message.user.name 5 .messagePost__date 6 = message.created_at.strftime("%Y年%m月%d日 %H時%M分") 7 .messagePost__message 8 = message.text 9 10 - if user_signed_in? 11 - if message.user_id == current_user.id 12 .messagePost__lower 13 .messagePost__lower__edit 14 = link_to "編集", "/messages/#{message.id}/edit", method: :get 15 .messagePost__lower__delete 16 = link_to "削除", "/messages/#{message.id}", method: :delete 17 - else 18 .messagePost__lower 19 .messagePost__lower__like 20 .messagePost__lower__like__count 21 いいね件数: 22 = @message.likes.count 23 .messagePost__lower__like__button 24 - if current_user.already_liked?(message) 25 = button_to 'いいねを取り消す', "/messages/message_id/likes/#{message.id}", method: :delete 26 - else 27 = button_to 'いいね', "/messages/message_id/likes", method: :post 28 - else 29 %div

試したこと

######①Likesコントローラーが動いているか確認。
Likesコントローラーのcreateアクションでbinding.pryを記述し実行したところ、処理は止まったので、コントローラーのcreateアクションは動いているかと思います。

######②上記、①を実行後のターミナルで、送られている値を確認。
※以下リンクが、該当のターミナルのキャプチャです。
ターミナルのキャプチャ
ターミナルを見て、user_idは取れているが、message_idが取れておりませんでした。

補足情報

以下の記事を参考に記述を行いました。
参考記事リンク

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

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

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

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

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

guest

回答1

0

ベストアンサー

全体をきちんと読んでいませんが、ここおかしいと目に止まった所
= button_to 'いいね', "/messages/message_id/likes",...

= button_to 'いいね', "/messages/#{message.id}/likes",...

投稿2020/01/27 12:05

winterboum

総合スコア23284

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

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

frusciante

2020/01/27 12:44

ご教示いただきありがとうございます! ご指摘いただいた箇所を修正したところ、期待通りに動き、DBにも値が入りました! ※deleteメソッドの方も修正いたします...。 URI Patternをそのままパスに記述してしまった事が原因だったのですが、コントローラー、モデルばかりに気を取られず、冷静にデバッグを行いたいと思います! 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問