1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】通知機能~変更点と補足~

Posted at

記事の対象者

実装した処理の動きについて理解したい人

前提条件

Ruby 2.6.3
Rails 6.1.5

参考にした記事

実装については、下記記事を参考にしました。
今回は一部変更した点と、実装した処理の動きについて自分で補足した部分を書いていきます。

実装の流れ(フォロー通知)

①通知モデルの作成(Notification)
②モデルの関連付け(UserとNotification)
③モデルに通知作成メソッドを作成
④コントローラーに通知作成メソッドの呼び出し処理作成
⑤ビューに通知一覧画面及び通知アイコンの作成

変更箇所

下記が変更点となります。補足を交えながら説明していきます。
・default_scope
・update_attributesメソッド

②モデルの関連付け(UserとNotification)

default_scopeですが、RuboCopの解析では引っかかってしまいます。
理由としては、default_scopeのメンテナンス性の悪さなどがあるようです・・・。
こちら、参考記事となります。
https://qiita.com/yusabana/items/f0b3a80111d6bd4ec8b0

ですので、コントローラーに同じ内容で書き直しました。
デフォルトスコープの内容は、「作成日時の降順」で指定となります。

Notification.rb
default_scope -> { order(created_at: :desc) }

↓ この内容をこちらへ変更

notifications_controller.rb
@notifications = current_user.passive_notifications.order(created_at: :desc)

③モデルに通知作成メソッドを作成

"?"は比較演算子の時に使用します。
"and"で繋いでいるので全ての条件が揃うデータのみ取得します。

User.rb
temp = Notification.where(["visitor_id = ? and visited_id = ? and action = ? ", current_user.id, id, 'follow'])

if 修飾子
「真(true)」となった場合に実行したい処理 if 条件式 となります。
すなわち、バリデーションでtrueの場合のみsaveを実行します。

User.rb
notification.save if notification.valid?

⑤ビューに通知一覧画面及び通知アイコンの作成

下記処理は、「未確認→確認済み」になるように更新を行っています。
しかし、update_attributesメソッドはRails 6.1になり、消去されてしまったため、使用することができません。
こちらはupdate_attributesからupdateに変更して実装しましょう。

notifications_controller.rb
notification.update_attributes(checked: true)

まとめ

Railsのバージョンにより変更が多くありますね。
その点について意識しながら実装することができたので、今後の他の実装にも生かしていきたいです!
最後まで読んでいただきありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?