複数モデルのerror_messages_for

を共通化できる機能がRails1.2で搭載されたらしいので、手元のRailsで試してみた。
…が!いくつか問題があったのでここにメモしておく。

config/enviroment.rbのRailsバージョンを変更する

RAILS_GEM_VERSION = '1.2.1'にしないといつまでも1.1.6のバージョンが使われるのだ。

ActiveHeartの問題

エラーメッセージを日本語化するプラグインActiveHeartでerror_messages_forを上書きしてるため、そっちが優先されてしまう。しょうがないので、Rails1.2.1のコードを引っ張ってきて自分で日本語化。

  def error_messages_for(*params)
    options = params.last.is_a?(Hash) ? params.pop.symbolize_keys : {}
    objects = params.collect {|object_name| instance_variable_get("@#{object_name}") }.compact
    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
#      header_message = "#{pluralize(count, 'error')} prohibited this #{(options[:object_name] || params.first).to_s.gsub('_', ' ')} from being saved"
      header_message = "#{count}個のエラーが発生しました"
      error_messages = objects.map {|object| object.errors.full_messages.map {|msg| content_tag(:li, msg) } }
      content_tag(:div,
        content_tag(options[:header_tag] || :h2, header_message) <<
          content_tag(:p, "次の項目に問題があります") <<
          content_tag(:ul, error_messages),
        html
      )
    else
      ''
    end
  end

とりあえずこれで動いてるんだけど、これで良いのかな??なんていうか、メッセージリソースくらい外部ファイル化してても良さそうな気がするんだけど、コードを直接いじるのがRails(Ruby)流?