time_formats.rbを使って日付を整形しjsonに変換する(rails)

time_formats.rbを使って日付を整形しjsonに変換する方法(rails)

大まかな流れは以下のようになる。

  1. time_formatsの設定
  2. jbuilderの設定
  3. jsファイルでjson形式で取得したデータを使用

以下それぞれの詳細について書いていく。

 

time_formatsの設定

config/initializers配下にtime_formats.rbファイルを作成。

time_formats.rbには以下のようにかく。

Time::DATE_FORMATS[:default] = '%Y/%m/%d %H:%M'

Time::DATE_FORMATS[:datetime] = '%Y/%m/%d %H:%M'

Time::DATE_FORMATS[:date] = '%Y/%m/%d'

Time::DATE_FORMATS[:time] = '%H:%M:%S'

Date::DATE_FORMATS[:default] = '%Y/%m/%d'

 

こうすることで、

 

もともと以下のような日付を表示するデフォルトのフォーマットだったものが、

irb(main):001:0> Time.now.to_s

=> 2018-10-11 00:36:37 +0900

 

以下のようになる。

irb(main):002:0> Time.now.to_s

=> "2018/10/11 00:36"

 

 

jbuilderの設定

json.jbuilderファイルにおいて、message というインスタンスの created_at のフォーマットをjson形式に変換するには以下のようにかく。

rubyオブジェクト.to_s、のように書く。

json.time   message.created_at.to_s

 

jsファイルでjson形式で取得したデータを使用

$(function() {
function buildHTML(message){

var html = `<div class="upper-message__date">
      ${ message.time }
     </div>`;

 return html;

 }

 

.... 

上記のように、json形式で受け取ったデータをjQueryオブジェクトとして使うと、

"2018/10/11 00:36" のように日付が整形されて表示される。

 

strftimeよりなぜtime_formatsを使うか

time_formatsを使用しなくとも、以下のようにjson.jbuilderファイルでstrftimeを使用すれば、日付の整形をすることができる。

message.created_at.strftime("%Y%m%d")

=> "2018/10/11 00:36"

 

ただ、この場合だと、日付を表示させる場所ごとに毎回 strftime("%Y%m%d") と書かなくてはならないため、面倒だし修正も大変になってしまう。

そのため、config/initializer/time_formats.rb で指定してあげた方が良い。