はしばみあきら blog

プログラミングアウトプットするブログ。202010スタート

【Rails】条件に応じて日付の表示を判定する

LINEのトーク表示って何時何分とか、何曜日とか、古い物だと2020.xx.xxみたいな感じで表示されます

あの部分を作ります

条件に応じて日付の表示を判定する

今日のメッセージなら xx:xx の表示
昨日〜1週間前までは x曜日 の表示 それ以前は 2020.xx.xx の表示

という形にします

ここはviewにガッツリ書くことにしまいた(本当はあんまりよろしくないのだけど...)

 p.latest-talk-show__data-time-notifiction
   span#data-time

pとspanを用意

この時点でcreated_atの値を確認

f:id:hashibamiakira:20201031220726p:plain

created_at: Sat, 31 Oct 2020 18:33:23 JST +09:00 という値が取れました

コードに記述を加えて分岐させていきます

p.latest-talk-show__data-time-notifiction
  span#data-time
    / もしトークが今日の物ならば
    - if Date.today == talk.talk.last.created_at.to_date
      = talk.talk.last.created_at.strftime('%H:%M')
    / もしトークが過去1週間ならば
    - elsif 1.week.ago.beginning_of_day.to_date..Time.zone.now.end_of_day.to_date == talk.talk.last.created_at.to_date
      - weeks = ["","","","","","",""]
      - num = talk.talk.last.created_at.strftime("%w").to_i
      - week = weeks[num]
      = week + "曜日"
    / それ以降であれば
    - else
      = talk.talk.last.created_at.strftime("%Y.%M.%D")

大分冗長です...すっきりさせたいけどそれは別の機会で...

少し読み解きます

  • if Date.today == talk.talk.last.created_at.to_date
    Date.todayをみます
=> Sat, 31 Oct 2020

== で今日の日付判定をcreated_atとする時、created_atにto_dateをつけましょう
何もつけないままだと時間の部分まで含めて判定するので今日の日付でもfalseになります

[3] pry(#<#<Class:0x00007f390891b390>>)> Date.today == talk.talk.last.created_at.to_date
=> true

trueが帰ってきました

= talk.talk.last.created_at.strftime('%H:%M')

created_atの中から時間と分を引っ張って表示させます

次に、今日と一致しない場合

  • elsif 1.week.ago.beginning_of_day.to_date..Time.zone.now.end_of_day.to_date == talk.talk.last.created_at.to_date

結構長いです!
まず1.week.ago.beginning_of_day.to_date..Time.zone.now.end_of_day.to_dateの部分

1.week.agoで現在の時間から1週間前を呼ぶことができます

[7] pry(#<#<Class:0x00007f390891b390>>)> 1.week.ago
=> Sat, 24 Oct 2020 22:19:33 JST +09:00

さらにbegining_of_dayでその日の始まり(00:00)になります

[10] pry(#<#<Class:0x00007f390891b390>>)> 1.week.ago.beginning_of_day 
=> Sat, 24 Oct 2020 00:00:00 JST +09:00

逆にTime.zone.nowで現在の時刻、.end_of_dayで終わり(23:59:59)を呼びます

今日の日付は最初のifで判定されるのでジャスト1週間前までのメッセージを呼べます

上記2つを .. で繋ぐことで1週間前のスタートから今日の終わりまでを指定します

ただやはり時間まではあると判定できないので、.to_dateをつけて日付のみにします

そしてそれを曜日に

      - weeks = ["日","月","火","水","木","金","土"]
      - num = talk.talk.last.created_at.strftime("%w").to_i
      - week = weeks[num]
      = week + "曜日"

.strftime("%W")とすることで曜日を0~6の数字で取れます

[1] pry(#<#<Class:0x0000000002fd42e0>>)> talk.talk.last.created_at.strftime("%w")
=> "6"

つまり、weeksに一旦文字列として値を入れ、numには取得した値を.to_iで数字に

weekにweeks[num]で数字に対応した曜日を入れることで曜日を取得できます

最後の行は割とシンプルですね

= talk.talk.last.created_at.strftime("%Y.%M.%D")

これで判定を行うことができました

実際の画面はこんな感じで

f:id:hashibamiakira:20201031230036p:plain

なかなか大変!

次はJavaScriptも触っていきます

またボチボチ更新していきます