前提・実現したいこと
初めて質問を投稿させていただきます。よろしくお願いいたします。
現在、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が取れておりませんでした。
補足情報
以下の記事を参考に記述を行いました。
参考記事リンク
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/27 12:44