やりたいこと
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: という項目を作ってあげる必要があります。
ja:
date:
abbr_day_names:
- 日
- 月
- 火
- 水
- 木
- 金
- 土
formats:
default: "%Y/%m/%d"
short: "%m/%d"
long: "%Y年%m月%d日(%a)"
併せて、application.rbのlocale設定を変更
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