capsctrldays

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|

こうかも。

本日のツッコミ(全2件) [ツッコミを入れる]
1 shachi (2006-07-14 (金) 20:20)

これって、rails.rb本体の書き換えになっちゃうんですよねぇ....避けたいなぁ。

2 kdmsnr (2006-07-14 (金) 23:24)

プラグイン化しても、なんか動きませんでした。うーん?やり方が悪いのかなあ。ロード順?