是非に及ばず

プログラミングに関する話題などを書いていきます(主にRailsやAndroidアプリ開発について)

Railsのi18nを利用して完全なエラーメッセージを取得する

Rails2.2からi18nを使って各種メッセージを日本語化出来るようになったが、
普通にerror_message_onを使うと・・・

error_message_on(:user, :name)
=> "を入力してください。"

これでは困るので、第3引数に項目名を渡す必要がある。
例えば、@user.nameが未入力の場合、以下のようにすると完全なエラーメッセージを取得できる。

#第3引数に"User.human_attribute_name('name')"を渡す
error_message_on(:user, :name, User.human_attribute_name('name'))
=> "名前を入力してください。"

毎回これをやるのは大変なので、ヘルパーにして使ってます。

app/helpers/application_helper.rb

# フィールドのエラーメッセージを1つ取り出す
#
#== 使用例
# <%= full_error_message_on(:user, :name) %>
#
#+object+:: オブジェクト名
#+method+:: メソッド名
#+css_class+:: エラーメッセージを囲むdivタグに指定するクラス名
#==戻り値
# エラーメッセージ。エラーがない場合はnil
module ApplicationHelper
  def full_error_message_on(object, method, css_class = 'formError')
    obj = instance_variable_get("@#{object}")
    prepend_text = obj.class.human_attribute_name(method.to_s)
    errors = obj.errors[method.to_sym]
    if errors.is_a?(Array) && errors.size > 0
      content_tag("div", "#{prepend_text}#{errors.first}", :class => css_class)
    end
  end
end