ActiveModelをインクルードしたクラスでvalidationでエラーにする場合、項目の名前をconfig/locales/**.ymlに設定してあげないとキーの値がそのまま出てしまう(正確にはアンダースコアがスペースに置換される)
例えばこんな感じで検索用のモデルを作成して
module Tasks
class Search
include ActiveModel::Model
attr_accessor :created_at_from, :created_at_to
validate :created_at
def created_at
errors.add(:created_at_from, 'が不正です!') if created_at_from.blank?
errors.add(:created_at_to, 'が不正です!!') if created_at_to.blank?
end
end
end
Viewではこんな感じで書く
<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>
<div>
<% @search.errors.full_messages.each do |msg| %>
<p><%= msg %></p>
<% end %>
<%= form_for @search, url: root_path, method: :get do |f| %>
<%= f.text_field :created_at_from, class: 'datepicker' %>
<%= f.text_field :created_at_to, class: 'datepicker' %>
<%= f.submit '送信' %>
<% end %>
</div>
すると、validationエラーはキー値がそのまま表示される(コントローラ側で@search.valid?を呼び出してvalidationを走らせる)
これはi18nの設定をすれば、キー値を日本語化することが可能。
まずは、config/environments/***.rbでdefault_localeを設定する
Rails.application.configure do
...
config.i18n.default_locale = :ja
end
config/locales/ja.ymlには以下のように設定すればOK
ja:
activemodel:
models:
tasks/search: "検索フォーム"
attributes:
tasks/search:
created_at_from: 開始日
created_at_to: 終了日
するとこんな感じで表示されるようになる