バリデーションチェックの日本語化

restful_authenticationを導入したあとで、ユーザー登録のバリデーションが英語だと気になった。

以下を、app/model/user.rb で修正

  validates_presence_of     :login, :email, :message => 'が空です。'
  validates_presence_of     :password,                   :if => :password_required?, :message => 'が空です。'
  validates_presence_of     :password_confirmation,      :if => :password_required?, :message => 'が空です。'
  validates_length_of       :password, :within => 4..40, :if => :password_required?, :too_short => 'が短すぎます(%d文字以上です)', :too_long => 'が長すぎます(%d文字以下です)。'
  validates_confirmation_of :password,                   :if => :password_required?, :message => "が一致していません。"
  validates_length_of       :login,    :within => 3..40, :too_short => 'が短すぎます(%d文字以上です)', :too_long => 'が長すぎます(%d文字以下です)。'
  validates_length_of       :email,    :within => 3..100, :too_short => 'が短すぎます(%d文字以上です)', :too_long => 'が長すぎます(%d文字以下です)。'
  validates_uniqueness_of   :login, :email, :case_sensitive => false, :message => 'は既に登録されています。'

  class << self
    HUMANIZED_ATTRIBUTE_KEY_NAMES = {
      "login" => "ユーザー名",
      "email" => "メール",
      "password" => "ユーザー名",
      "password_confirmation" => "パスワード確認",
    }

    def human_attribute_name(attribute_key_name)
      HUMANIZED_ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
    end
  end

  

さらに日本語化を進めるには、

# Methods added to this helper will be available to all templates in the application.
module ApplicationHelper
  def error_messages_for(*params)
    options = params.extract_options!.symbolize_keys
    if object = options.delete(:object)
      objects = [object].flatten
    else
      objects = params.collect {|object_name| instance_variable_get("@#{object_name}") }.compact
    end
    count   = objects.inject(0) {|sum, object| sum + object.errors.count }
    unless count.zero?
      html = {}
      [:id, :class].each do |key|
        if options.include?(key)
          value = options[key]
          html[key] = value unless value.blank?
        else
          html[key] = 'errorExplanation'
        end
      end
      options[:object_name] ||= params.first
      options[:header_message] = "#{count}個のエラーが発生しました" unless options.include?(:header_message)
      options[:message] ||= '次の項目に問題があります:' unless options.include?(:message)
      error_messages = objects.map {|object| object.errors.full_messages.map {|msg| content_tag(:li, msg) } }

      contents = ''
      contents << content_tag(options[:header_tag] || :h2, options[:header_message]) unless options[:header_message].blank?
      contents << content_tag(:p, options[:message]) unless options[:message].blank?
      contents << content_tag(:ul, error_messages)

      content_tag(:div, contents, html)
    else
      ''
    end
  end
end

http://d.hatena.ne.jp/shunsuk/20080625/1214381487 を参考にさせていただいた。