Edited at

[rails]date_field_tagで入力した日付をdate型に変換して特定フォーマットで表示する方法

More than 1 year has passed since last update.


やりたいこと

date_field_tagで入力された日付を特定フォーマット(yyyy年mm月dd日(r曜日))に変換したい。

具体的にはViewからある文字を入力させて、値をMailerに渡して、メールを送りたい。

Rails ver: 4.2.6

Ruby ver: 2.3.1


やり方


View部分

モデルに紐付かない形にしたかったので、date_field_tagで指定。 初期値はなし(nil)

= date_field_tag 'date', nil


controller部分

params[:date]は、string型であり、フォーマットはyyyy-mm-ddになっている。

date = params[:date]

そして、値をdate型に変換する際は

date.to_date

のようにする。

その他にも、

date.in_time_zone

date.to_time
date_datetime


等が使え、様々な型に変換できる。

[参考リンク]

http://qiita.com/aono/items/3d348fb5bd7f85a3a6ed


表示フォーマット変換

フォーマット変換はいくつかやり方がありますが、railsの場合、i18nを使うのが良いかなと思っています。

一度定義すれば流用しやすく、管理もしやすいです。


1.フォーマットの登録

localesファイルに登録します。

ファイルを作ってもいいですが、ここから持ってきて自分で変更してもOK

https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

以下のようにすることで、言語が日本語で、date型の場合の表示を方法を定義できます。

なお、time型の場合は、time: という項目を作ってあげる必要があります。


config/locales/ja.yml

ja:

date:
abbr_day_names:
-
-
-
-
-
-
-
formats:
default: "%Y/%m/%d"
short: "%m/%d"
long: "%Y年%m月%d日(%a)"

併せて、application.rbのlocale設定を変更


application.rb

config.i18n.default_locale = :ja



2.使ってみる

以下のように使います。

I18n.l('時刻の指定', format: '使うフォーマットの指定')



I18n.l(date.to_date, format: :long)

なお、viewであれば、ヘルパーメソッドが使えるのでもっと簡潔に書けます。

l date.to_date, format: :long


参考リンク

Railsで文字列から日時をパースしたい

http://qiita.com/aono/items/3d348fb5bd7f85a3a6ed

【Rails】曜日フォーマット

http://qiita.com/onody/items/ad84fdd6c4b2013affdf

RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い

http://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c