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

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

ただいまの
回答率

87.59%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,748

score 15

前提・実現したいこと

Railsで通知機能(いいね、コメント、フォロー)を実装しています。
参考Qiita1
参考Qiita2
上記の記事を参考に設定が終わり、テーブルに通知データが保存でき、削除もできるようになりました。

保存されている通知データのテーブル情報

しかし、通知が表示されるビューに遷移すると、通知はないとされてしまいます。

通知はテーブルに保存されており、削除ボタンを押すときちんと削除されるので正常に動いているとは思いますが、肝心の通知データをビューに表示する部分で躓いています。

**解決したい部分の詳細は「該当のソースコード】に載せます。
ご教授いただけると幸いです。

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

通知が表示されるビューに遷移すると、通知はないとされる。
保存されているはずのデータが表示されない(動画)

しかし、黄色のマークが点灯し、最新の通知があるはずなのに「通知はない」といわれている状態。

該当のソースコード

@notificationsに挿入された最新の通知データをビューにわたすが、空だといわれてしまい、「通知はない」と表示されてしまう。

class NotificationsController < ApplicationController
  def index
    @user = current_user
    #current_userの投稿に紐づいた通知一覧
**    @notifications = current_user.passive_notifications**
    @notifications.where(checked: false).each do |notification|
      notification.update_attributes(checked: true)
    end
  end

  def destroy
    @notifications = current_user.passive_notifications.destroy_all
    redirect_to notifications_path(current_user)
  end
end
.text-center
  通知
  = link_to notification_path(@notifications), method: :delete do
    %i.fas.fa-trash{style: "color: black;"}
    %h7{style: "color: black;"} 全削除
  %hr/
**- if @notifications.exists?
  .users-index
    = render @notifications**
- else
  %section.section
    .user-container
      .column.is-12
        .column.is-4
          %p 通知はありません

⬇︎モデル

  has_many :active_notifications, class_name: "Notification", foreign_key: "visiter_id", dependent: :destroy
  has_many :passive_notifications, class_name: "Notification", foreign_key: "visited_id", dependent: :destroy
  has_many :notifications, dependent: :destroy

  def create_notification_like!(current_user)
    # すでに「いいね」されているか検索
    temp = Notification.where(["visiter_id = ? and visited_id = ? and cafeteria_id = ? and action = ? ", current_user.id, user_id, id, 'like'])
    # いいねされていない場合のみ、通知レコードを作成
    return if temp.present?
    notification = current_user.active_notifications.new(
      cafeteria_id: id,
      visited_id: user_id,
      action: 'like'
    )
      # 自分の投稿に対するいいねの場合は、通知済みとする
    if notification.visiter_id == notification.visited_id
      notification.checked = true
    end
    notification.save if notification.valid?
  end

  def create_notification_comment!(current_user, comment_id)
    # 自分以外にコメントしている人をすべて取得し、全員に通知を送る
    temp_ids = Comment.select(:user_id).where(cafeteria_id: id).where.not(user_id: current_user.id).distinct
    temp_ids.each do |temp_id|
      save_notification_comment!(current_user, comment_id, temp_id['user_id'])
    end
    # まだ誰もコメントしていない場合は、投稿者に通知を送る
    save_notification_comment!(current_user, comment_id, user_id) if temp_ids.blank?
  end

  def save_notification_comment!(current_user, comment_id, visited_id)
    # コメントは複数回することが考えられるため、1つの投稿に複数回通知する
    notification = current_user.active_notifications.new(
      cafeteria_id: id,
      comment_id: comment_id,
      visited_id: visited_id,
      action: 'comment'
    )
    # 自分の投稿に対するコメントの場合は、通知済みとする
    if notification.visiter_id == notification.visited_id
      notification.checked = true
    end
    notification.save if notification.valid?
  end
class Notification < ApplicationRecord
  default_scope->{order(created_at: :desc)}

  belongs_to :cafeteria, optional: true
  belongs_to :comment, optional: true
  belongs_to :visiter, class_name: 'User', foreign_key: 'visiter_id', optional: true
  belongs_to :visited, class_name: 'User', foreign_key: 'visited_id', optional: true
end


⬇︎コントローラー

  def create
    @cafeteria = Cafeteria.find(params[:cafeteria_id])
    like = current_user.likes.create(cafeteria_id: params[:cafeteria_id])
    like.save
    @cafeteria.create_notification_like!(current_user)
  end
  def create
    @user = User.find(params[:following_id])
    current_user.follow(@user)
    @user.create_notification_follow!(current_user)
  end
  def create
    @cafeteria = Cafeteria.find(params[:cafeteria_id])
    @comment = @cafeteria.comments.build(comment_params)
    @comment.user_id = current_user.id
    @comment_cafeteria = @comment.cafeteria
    if @comment.save
      @comment_cafeteria.create_notification_comment!(current_user, @comment.id)
      render :index
    end
  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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

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