ActiveForm のエラーメッセージを日本語化

趣旨

任意のクラスに対して ActiveRecord 風の validation が掛けられるようになる ActiveForm plugin。便利だが、一つの問題は、<%= error_messages_for 'active_form_object' %>

としたとき、エラーメッセージの前半部が「priceは不正な値です」みたいになってしまってかっこ悪い。

ActiveHeart の set_field_names を使えば、この「価格は不正な値です」と表示させられる。ただし、これは ActiveRecord::Base なクラスに対してだけである。

ハック

プラグイン自体をいじるのは美しくないが、今回は面倒なので、ActiveForm 自体を改造してしまうことにする。vendor/plugin/(ActiveFormディレクトリ)/lib/active_form.rb の中から、

  def self.human_attribute_name(attribute_key_name)
    attribute_key_name.humanize
  end

  class << self
    def set_field_names(field_names = {})
      @field_names = HashWithIndifferentAccess.new unless @field_names
      @field_names.update(field_names)
    end
    
    def human_attribute_name(attribute_key_name)
      if @field_names && @field_names[attribute_key_name]
        @field_names[attribute_key_name]
      else
        attribute_key_name.humanize
      end
    end
  end

に置き換えるだけ。後半部のコードは ActiveHeart をほぼコピーしただけである。(一部変えてある)要するに human_attribute_name を日本語化してあげようというわけだ。これで、ActiveRecord::Base に対してと同じように ActiveForm なクラスに対しても、set_field_names が使えるようになる。