自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。
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/を見てみたところ、テストケース書け!って書いてある。ってか、正直書き方わかりません....ということで放置の方向で。あ、いや、誰かテスト書いて〜。

validates_length_ofのテストはこんな感じでどうでしょう。
とりあえず:minimumだけ。
http://www.moriq.com/ruby/archive/activerecord-validates_length_of_utf8.patch
Content-Typeのほうもテストを作ってみました。
http://www.moriq.com/ruby/archive/actinpack-xml_rjs_content_type.patch
これは既存のテストを修正しています。
ありがとうございます!!
ちょっと今日は時間が取れないので明日にでも。