Ruby
Rails
初心者
datetime

【Rails】通知の時間を「○日前」「○分前」のようにいい感じに表示する

通知機能を作成したものの…

RailsでQiitaのようなアプリを作成して、通知機能を作成した。
ちなみに参考にした記事はこちら。めっちゃわかりやすい。
https://rails-school.net/rails-notification/

ただ、何もしないと、

スクリーンショット 2018-08-04 19.20.12.png

こんな感じになってしまう。なんというか、しっくりこない!
これはNotificationモデルのcreated_atを列挙しているだけなので、機械的に時間を列挙している。

いい感じの「○日前」「○分前」を検討した。

もっと通知っぽくしたい!

そこで、ツイッターの通知みたいないい感じの「○日前」「○分前」を検討した。

条件 表示例
60分以内 "10分前"
24時間以内 "5時間前"
30日以内 "14日前"
それ以前 created_atそのまま

これならばいい感じに通知っぽくなるのではないか!
こんな感じの時間表示をしてくれるメソッドやgemを探したけれど特に見つからなかったので自分で作ることにした。

それがこちら

notification.rb
def how_long_ago
  if (Time.now - self.created_at) <= 60 * 60
    # 60分以内なら
    ((Time.now - self.created_at) / 60).to_i.to_s + "分前"
  elsif (Time.now - self.created_at) <= 60 * 60 * 24
    # 24時間以内なら
    ((Time.now - self.created_at) / 3600).to_i.to_s + "時間前"
  elsif (Date.today - self.created_at.to_date) <= 30
    # 30日以内なら
    (Date.today - self.created_at.to_date).to_i.to_s + "日前"
  else
    # それ以降
    self.created_at
  end
end

注意すべきところは二つ
・途中まではDateTime型での引き算になるが、途中からはto_dateメソッドを使ってDate型に変換しないと「○日前」が実際の日付とずれてしまう
・引き算の結果をto_iで整数に変換してto_sで文字列に変換して、文字列を連結させる。

 結果

notification.created_atnotification.how_long_agoに変えてみると、

スクリーンショット 2018-08-04 19.19.12.png

いい感じに通知っぽくなった!

追記

time_ago_in_wordsという完璧な方法がありました…とほほ