よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

January 31, 2006 [おもひで]

[Rails] パッチ2題

1つめは、ActiveRecordのvalidates_length_ofが日本語だとうまくいかない件。うまくいかないっていうか、結局バイト数になっちゃってるからそこを文字数でカウントしてあげるようにすれば良いだけなんだけどね。

(activate-x.x.x/lib/activerecord/validations.rbへのパッチね)

--- validations.rb.old  2006-01-31 02:22:42.000000000 +0900
+++ validations.rb      2006-01-31 02:41:03.000000000 +0900
@@ -459,7 +459,7 @@
           message = (options[:message] || options[message_options[option]]) % option_value
  
           validates_each(attrs, options) do |record, attr, value|
-            record.errors.add(attr, message) unless !value.nil? and value.size.method(validity_checks[option])[option_value]
+            record.errors.add(attr, message) unless !value.nil? and value.split(//).size.method(validity_checks[option])[option_value]
           end
         end
       end

あ、そうそう、どこかで$KCODEを指定しとかないとsplit(//)がうまく動作しないので念のため。

もう一つは、Content-Typeをアプリ側で指定してしまうとRJSが動作しなくなる件。例えば以下のような例。

class ApplicationController < ActionController::Base
  before_filter :set_charset
  def set_charset
    @headers["Content-Type"] = "text/html; charset=utf-8" 
  end
end

これって、.rjsなファイルだったら強制的にContent-Typeをtext/javascriptにしちゃえばいいと思うんだけど、それをせずにすでに指定された上記の"text/html; charset=utf-8"を使うのが問題だと思う。

なので、このパッチは.rjs/.rxmlの時は強制的にContent-Typeを書き換えるようにする。

以下は、SVN版のactionpack/lib/action_view/base.rbへのパッチ

--- base.rb.old 2006-01-31 02:05:28.000000000 +0900
+++ base.rb     2006-01-31 02:05:38.000000000 +0900
@@ -394,10 +394,10 @@
           body = case extension.to_sym
             when :rxml
               "xml = Builder::XmlMarkup.new(:indent => 2)\n" +
-              "@controller.headers['Content-Type'] ||= 'text/xml'\n" +
+              "@controller.headers['Content-Type'] = 'text/xml'\n" +
               template
             when :rjs
-              "@controller.headers['Content-Type'] ||= 'text/javascript'\n" +
+              "@controller.headers['Content-Type'] = 'text/javascript'\n" +
               "update_page do |page|\n#{template}\nend"
           end
         else

で、これ、RailsのMLに投げたら、Trac使え、と言われたので言われたとおりにhttp://dev.rubyonrails.org/を見てみたところ、テストケース書け!って書いてある。ってか、正直書き方わかりません....ということで放置の方向で。あ、いや、誰かテスト書いて〜。

本日のツッコミ(全3件) [ツッコミを入れる]
moriq (February 01, 2006 06:15)

validates_length_ofのテストはこんな感じでどうでしょう。
とりあえず:minimumだけ。
http://www.moriq.com/ruby/archive/activerecord-validates_length_of_utf8.patch

moriq (February 01, 2006 06:52)

Content-Typeのほうもテストを作ってみました。
http://www.moriq.com/ruby/archive/actinpack-xml_rjs_content_type.patch
これは既存のテストを修正しています。

むとう (February 02, 2006 00:08)

ありがとうございます!!
ちょっと今日は時間が取れないので明日にでも。


編集