JanGaJan.com

Is fun? JOY!

I18nの設定でdatetime_selectのエラー対応

パーフェクト Ruby on Railsを、第6章からやってます。

日本語対応のi18nの設定でエラーが発生しました。
補足ですが、私のRailsの環境は4.1.5です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ActionView::Template::Error (undefined method `map' for "translation missing: ja.date.order":String):
    27:   </div>
    28:   <div class="form-group">
    29:     <%= f.label :end_time %>
    30:     <%= f.datetime_select :end_time, start_year: now.year, end_year: now.year + 1 %>
    31:   </div>
    32:   <div class="form-group">
    33:     <%= f.label :content %>
  app/views/events/new.html.erb:30:in `block in _app_views_events_new_html_erb__622987462779560017_70179900721920'
  app/views/events/new.html.erb:5:in `_app_views_events_new_html_erb__622987462779560017_70179900721920'


  Rendered vendor/bundle/ruby/2.1.0/gems/actionpack-4.1.5/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (1.8ms)
  Rendered vendor/bundle/ruby/2.1.0/gems/actionpack-4.1.5/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.5ms)
  Rendered vendor/bundle/ruby/2.1.0/gems/actionpack-4.1.5/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout (16.9ms)

date.orderの指定

発生箇所

該当するソースコードはこちらです。
ちなみに、i18nを無効化(config.i18n.default_localeを初期状態のようにコメントアウト)していると発生しません。

1
2
3
4
  <div class="form-group">
    <%= f.label :start_time %>
    <%= f.datetime_select :start_time, start_year: now.year, end_year: now.year + 1 %>
  </div>

エラーメッセージからすると、ja.date.orderで翻訳に失敗しちゃったよテヘってなってるんで、ja.yml修正すれば良さそう。

解決策

2つあります。

ここに書いてありますね。

datetime_select also looks up the order option from date.order (unless you pass the option explicitly).

ja.ymlに設定を追加

翻訳ファイルの修正です。

config/locals/ja.yml
1
2
3
4
5
6
ja:
  date:
    order:
      - :year
      - :month
      - :day

なお、デフォルト(en)の場合は、activesupportの設定が適用されています。

datetime_selectのoptionにorderを追加

datetime_selectにorderというoptionを追加することで、ja.ymlの修正をしないで対応できます。
優先順位はja.ymlで設定 < datetime_selectでoption指定なので、必要があれば設定すればいいと思います。

config/locals/ja.yml
1
2
3
4
  <div class="form-group">
    <%= f.label :start_time %>
    <%= f.datetime_select :start_time, start_year: now.year, end_year: now.year + 1, order: [:year, :month, :day] %>
  </div>

Comments