Railsのscaffoldで使われているerror_messages_forってすっごく便利なのですが、 これリストの入力フォームに対応していないんですよね。 上記の画面には2行のテーブルがあって、 交通費、宿泊費、その他の3レコードが含まれています。つまり3×2で6レコードです。 普通にerror_messages_forだとチェック自体は行われますが、エラーメッセージが最後の1レコード分しか出ませんでした。 というわけで、すべてのレコードのエラーを拾って重複を排除して表示する用にしてみました。 app/helpers/application_helperにメソッドを追加してもいいんですが、最近ActiveHeartを入れたばかりなので、 vender/plugin/active_heart/lib/active_recorde_message_ja.rbのerror_messages_forの下に下記コードを追加しておきました。
  def list_error_messages_for (object_name, options = {})
    objects = instance_variable_get("@#{object_name}")
    errors = Array.new
    for record in objects
      unless record.errors.empty?
        record.errors.each_full { |msg| errors.push(msg)}
      end
    end
    errors = errors.uniq
    unless errors.empty?
      options = options.symbolize_keys
      content_tag("div",
        content_tag(
          options[:header_tag] || "h2",
          "#{errors.size}個のエラーが発生しました"
        ) +
        content_tag("p", "次の項目に問題があります") +
        content_tag("ul", errors.collect { |msg| content_tag("li", msg) }),
                    "id" => options[:id] || "errorExplanation", 
                    "class" => options[:class] || "errorExplanation"
        )
    end
  end
ruby&rails初心者なので恥ずかしい限りですが、一応動作はしているみたいです。ツッコミ有ればご指導下さい。 つか、こんなのとっくに誰か作っている気もする。更に言えば確実に此処はRailsらしからぬ実装になってしまったかも。 エラーチェック自体は相変わらず適当(あえてエラー出しています)なのですが・・・ が、またしても此処で問題が。 詳細の項目には:allow_nilでnilやブランクの場合はチェックしないようにしているんですが、何故かチェックされてしまいます。他の所はちゃんと動作しているのに・・・ 近々攻略予定です。