前提・実現したいこと
Railsで通知機能(いいね、コメント、フォロー)を実装しています。
参考Qiita1
参考Qiita2
上記の記事を参考に設定が終わり、テーブルに通知データが保存でき、削除もできるようになりました。
しかし、通知が表示されるビューに遷移すると、通知はないとされてしまいます。
通知はテーブルに保存されており、削除ボタンを押すときちんと削除されるので正常に動いているとは思いますが、肝心の通知データをビューに表示する部分で躓いています。
**解決したい部分の詳細は「該当のソースコード】に載せます。
ご教授いただけると幸いです。
発生している問題・エラーメッセージ
通知が表示されるビューに遷移すると、通知はないとされる。
保存されているはずのデータが表示されない(動画)
しかし、黄色のマークが点灯し、最新の通知があるはずなのに「通知はない」といわれている状態。
該当のソースコード
@notificationsに挿入された最新の通知データをビューにわたすが、空だといわれてしまい、「通知はない」と表示されてしまう。
NotificationsController
1class NotificationsController < ApplicationController 2 def index 3 @user = current_user 4 #current_userの投稿に紐づいた通知一覧 5** @notifications = current_user.passive_notifications** 6 @notifications.where(checked: false).each do |notification| 7 notification.update_attributes(checked: true) 8 end 9 end 10 11 def destroy 12 @notifications = current_user.passive_notifications.destroy_all 13 redirect_to notifications_path(current_user) 14 end 15end
NotificationsIndexHaml
1.text-center 2 通知 3 = link_to notification_path(@notifications), method: :delete do 4 %i.fas.fa-trash{style: "color: black;"} 5 %h7{style: "color: black;"} 全削除 6 %hr/ 7**- if @notifications.exists? 8 .users-index 9 = render @notifications** 10- else 11 %section.section 12 .user-container 13 .column.is-12 14 .column.is-4 15 %p 通知はありません
⬇︎モデル
UserModel
1 has_many :active_notifications, class_name: "Notification", foreign_key: "visiter_id", dependent: :destroy 2 has_many :passive_notifications, class_name: "Notification", foreign_key: "visited_id", dependent: :destroy
PostModel
1 has_many :notifications, dependent: :destroy 2 3 def create_notification_like!(current_user) 4 # すでに「いいね」されているか検索 5 temp = Notification.where(["visiter_id = ? and visited_id = ? and cafeteria_id = ? and action = ? ", current_user.id, user_id, id, 'like']) 6 # いいねされていない場合のみ、通知レコードを作成 7 return if temp.present? 8 notification = current_user.active_notifications.new( 9 cafeteria_id: id, 10 visited_id: user_id, 11 action: 'like' 12 ) 13 # 自分の投稿に対するいいねの場合は、通知済みとする 14 if notification.visiter_id == notification.visited_id 15 notification.checked = true 16 end 17 notification.save if notification.valid? 18 end 19 20 def create_notification_comment!(current_user, comment_id) 21 # 自分以外にコメントしている人をすべて取得し、全員に通知を送る 22 temp_ids = Comment.select(:user_id).where(cafeteria_id: id).where.not(user_id: current_user.id).distinct 23 temp_ids.each do |temp_id| 24 save_notification_comment!(current_user, comment_id, temp_id['user_id']) 25 end 26 # まだ誰もコメントしていない場合は、投稿者に通知を送る 27 save_notification_comment!(current_user, comment_id, user_id) if temp_ids.blank? 28 end 29 30 def save_notification_comment!(current_user, comment_id, visited_id) 31 # コメントは複数回することが考えられるため、1つの投稿に複数回通知する 32 notification = current_user.active_notifications.new( 33 cafeteria_id: id, 34 comment_id: comment_id, 35 visited_id: visited_id, 36 action: 'comment' 37 ) 38 # 自分の投稿に対するコメントの場合は、通知済みとする 39 if notification.visiter_id == notification.visited_id 40 notification.checked = true 41 end 42 notification.save if notification.valid? 43 end
NotificationModel
1class Notification < ApplicationRecord 2 default_scope->{order(created_at: :desc)} 3 4 belongs_to :cafeteria, optional: true 5 belongs_to :comment, optional: true 6 belongs_to :visiter, class_name: 'User', foreign_key: 'visiter_id', optional: true 7 belongs_to :visited, class_name: 'User', foreign_key: 'visited_id', optional: true 8end
⬇︎コントローラー
LikeController
1 def create 2 @cafeteria = Cafeteria.find(params[:cafeteria_id]) 3 like = current_user.likes.create(cafeteria_id: params[:cafeteria_id]) 4 like.save 5 @cafeteria.create_notification_like!(current_user) 6 end
RelationshipsController
1 def create 2 @user = User.find(params[:following_id]) 3 current_user.follow(@user) 4 @user.create_notification_follow!(current_user) 5 end
CommentsController
1 def create 2 @cafeteria = Cafeteria.find(params[:cafeteria_id]) 3 @comment = @cafeteria.comments.build(comment_params) 4 @comment.user_id = current_user.id 5 @comment_cafeteria = @comment.cafeteria 6 if @comment.save 7 @comment_cafeteria.create_notification_comment!(current_user, @comment.id) 8 render :index 9 end 10 end
⬇︎データベース
class CreateNotifications < ActiveRecord::Migration[5.2] def change create_table :notifications do |t| t.integer :visiter_id, null: false t.integer :visited_id, null: false t.integer :cafeteria_id t.integer :comment_id t.string :action, default: '', null: false t.boolean :checked, default: false, null: false t.timestamps end add_index :notifications, :visiter_id add_index :notifications, :visited_id add_index :notifications, :cafeteria_id add_index :notifications, :comment_id end end
試したこと
参考Qiita1
参考Qiita2
打ち間違いを探りましたが、特に見当たりませんでした。
補足情報(FW/ツールのバージョンなど)
rails5.2.4.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。