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の下に下記コードを追加しておきました。
エラーチェック自体は相変わらず適当(あえてエラー出しています)なのですが・・・
が、またしても此処で問題が。
詳細の項目には:allow_nilでnilやブランクの場合はチェックしないようにしているんですが、何故かチェックされてしまいます。他の所はちゃんと動作しているのに・・・
近々攻略予定です。
上記の画面には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やブランクの場合はチェックしないようにしているんですが、何故かチェックされてしまいます。他の所はちゃんと動作しているのに・・・
近々攻略予定です。
コメント