LoginSignup
12
12

More than 3 years have passed since last update.

Railsで通知機能を作る(②既読管理編)

Posted at

やったこと

Railsでアプリを作る課題を行っています。通知機能を作りましょうというタスクがありました。
初めて作る&覚えておくと応用が効きそうなので、以下にやり方をまとめます。

なお、実行環境は以下の通りです。

  • Rails 5.2.3
  • Ruby 2.6.4

仕様

以下のような仕様になっています。

  • userがフォローされた時
  • userの投稿したpostにコメントがついた時
  • userの投稿に「いいね!」がされた時

なお、基本的な機能の実装は、こちらの記事で解説しています。

Railsで通知機能を作る(①基本機能編)

DB設計

DB設計はこちらの通りです。
Image from Gyazo

activitiesテーブルのreadカラムで既読の管理をしていますが、それ以外のDB設計の詳細については、先の「①基本機能編」の記事と、こちらの記事を参照してください。

Routing

今回、既読管理はreadというメソッドをactivityコントローラー下に作って実装します。そのため、ルーティングを下記のように実装します。

config/routes.rb
resources :activities, only: [] do
  patch :read, on: :member
end

only: []なんて書き方は初めて見ましたが、Railsの基本の7アクションがなくて、かつオリジナルのメソッドだけある時は、これで書けるようです。知らなかった。

Model

続いてモデルです。モデルには、enumreadunreadを定義します。

models/activity.rb
enum read: {
  unread: false,
  read: true,
}

enumって、boolean型にも使えるのですね。truefalseにそれぞれ別の名前がつけられて、文脈がわかりやすくなりますね。

また、モデルには以下のようなメソッドも定義しました。

models/activity.rb
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メソッドはこのように実装します。

controllers/activities_controller.rb
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では既読の時だけ色が変わるように設定して...。

Image from Gyazo

クリックすると色が変わり、ビジュアルに既読管理ができるようになりました。

最終的には、こちらに「未読の件数」表示のバッジをつけて完成しましたが、以上で、既読管理の完成です。

まとめ

初めは、実装についてあまりイメージのついていなかった「通知」機能ですが、

  • 「通知」テーブルを別途作る
  • 通知対象のアクションが行われたら、「通知」レコードを一つ作る
  • 通知を確認するためのリンクを設定し、リンクをクリックしたらステータスを「既読」にする

というのが大まかなポイントなのかなと思いました。
ポリモーフィック関連付けについては、使い所をもう少し抽象的に理解したいです。

それでは、引き続き頑張っていきます。

12
12
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
12
12