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

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

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

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

Q&A

解決済

1回答

965閲覧

【Rails 通知機能】テーブルに通知データは保存されているが、通知のビューに遷移すると「通知はない」といわれる。

akaki

総合スコア15

Ruby on Rails

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

0グッド

1クリップ

投稿2020/06/09 02:56

編集2020/06/09 14:40

前提・実現したいこと

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

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

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

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

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

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

guest

回答1

0

自己解決

ヘルパーの設定を変えたら解決できました!

投稿2020/06/09 14:41

akaki

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問