やったこと
Railsでアプリを作る課題を行っています。通知機能を作りましょうというタスクがありました。
初めて作る&覚えておくと応用が効きそうなので、以下にやり方をまとめます。
なお、実行環境は以下の通りです。
- Rails
5.2.3
- Ruby
2.6.4
仕様
以下のような仕様になっています。
-
user
がフォローされた時 -
user
の投稿したpost
にコメントがついた時 -
user
の投稿に「いいね!」がされた時
なお、基本的な機能の実装は、こちらの記事で解説しています。
DB設計
activities
テーブルのread
カラムで既読の管理をしていますが、それ以外のDB設計の詳細については、先の「①基本機能編」の記事と、こちらの記事を参照してください。
Routing
今回、既読管理はread
というメソッドをactivity
コントローラー下に作って実装します。そのため、ルーティングを下記のように実装します。
resources :activities, only: [] do
patch :read, on: :member
end
only: []
なんて書き方は初めて見ましたが、Railsの基本の7アクションがなくて、かつオリジナルのメソッドだけある時は、これで書けるようです。知らなかった。
Model
続いてモデルです。モデルには、enum
でread
とunread
を定義します。
enum read: {
unread: false,
read: true,
}
enumって、boolean型にも使えるのですね。true
とfalse
にそれぞれ別の名前がつけられて、文脈がわかりやすくなりますね。
また、モデルには以下のようなメソッドも定義しました。
def transition_path
case action_type.to_sym
when :commented_to_own_post
post_path(subject.post, anchor: "js-comment-#{subject.id}")
when :liked_to_own_post
post_path(subject.post)
when :followed_me
user_path(subject.follower)
end
end
こちらは、この後すぐ利用します^^
Controller
controllerのread
メソッドはこのように実装します。
class ActivitiesController < ApplicationController
# beforeフィルターなどは省略
def read
activity = current_user.activities.find(params[:id])
activity.read! if activity.unread?
redirect_to activity.transition_path
end
end
read
メソッドが実行されたら、read
カラムの中身がfalse(unread)
の時に、read
にして、先に設定したtransition_path
に遷移する仕組みです。
仕上げ&完成
あとは、詳細省きますが、Viewでは既読の時だけ色が変わるように設定して...。
クリックすると色が変わり、ビジュアルに既読管理ができるようになりました。
最終的には、こちらに「未読の件数」表示のバッジをつけて完成しましたが、以上で、既読管理の完成です。
まとめ
初めは、実装についてあまりイメージのついていなかった「通知」機能ですが、
- 「通知」テーブルを別途作る
- 通知対象のアクションが行われたら、「通知」レコードを一つ作る
- 通知を確認するためのリンクを設定し、リンクをクリックしたらステータスを「既読」にする
というのが大まかなポイントなのかなと思いました。
ポリモーフィック関連付けについては、使い所をもう少し抽象的に理解したいです。
それでは、引き続き頑張っていきます。