2006-07-14 (金) [長年日記]
■ [Rails] GetTextでerror_message_on
むとうさんに「Railsの」ソースを送ってからハタと気づいた。 こっちのソースを送るべきでした。で、さっきやってみたらそれなりに動いている感じでした。どんなもんでしょうか。
--- rails.rb.orig 2006-07-14 14:14:43.000000000 +0900
+++ rails.rb 2006-07-14 15:04:42.000000000 +0900
@@ -294,6 +294,35 @@
}
cattr_accessor :default_error_messages_d
+ def attr_message attr
+ attr_messages = []
+ @errors[attr].each do |msg|
+ next if msg.nil?
+ custom_msg = nil
+ #Ugly but... :-<
+ @@default_error_messages_d.merge(@base.custom_error_messages_d).each do |key, regexp|
+ if regexp =~ msg
+ custom_msg = @base.gettext(key)
+ custom_msg = _(msg) if custom_msg == msg
+ custom_msg = _(custom_msg) % $1.to_i
+ break
+ end
+ end
+ unless custom_msg
+ custom_msg = @base.gettext(msg)
+ custom_msg = _(msg) if custom_msg == msg
+ end
+ if attr == "base"
+ attr_messages << custom_msg
+ elsif RE_FIELD_NAME =~ custom_msg
+ attr_messages << custom_msg % {:fn => @base.class.human_attribute_name(attr)}
+ else
+ attr_messages << @base.class.human_attribute_name(attr) + " " + custom_msg
+ end
+ end
+ attr_messages
+ end
+
def full_messages #:nodoc:
full_messages = []
@errors.each_key do |attr|
@@ -388,6 +417,14 @@
object = instance_variable_get("@#{object_name}")
L10n.error_messages_for(object, object_name, self, options)
end
+ def error_message_on(object, method, prepend_text = "", append_text = "", css_class = "formError")
+ object = instance_variable_get("@#{object}")
+ if errors = object.errors.on(method)
+ content_tag("div",
+ "#{prepend_text}#{object.errors.attr_message(method)}#{append_text}",
+ :class => css_class)
+ end
+ end
end
end
end
追記
エラーが全部出てきちゃうので、
def attr_message attr attr_messages = [] - @errors[attr].each do |msg| + @errors[attr].first.each do |msg|
こうかも。

これって、rails.rb本体の書き換えになっちゃうんですよねぇ....避けたいなぁ。
プラグイン化しても、なんか動きませんでした。うーん?やり方が悪いのかなあ。ロード順?