Rails 2.0.2とRuby 1.8.7のString#respond_to?

投稿者 akira 2008-06-18 15:00:00 GMT

に対してというのは、Ruby 1.8.7以前からMarshalが持っていたバグをRuby 1.8.7で直したところ、delegate.rbにも同様のバグがあったのが顕在化した、という話なのだったと思う。で、それを直しましたというのがであり、1.8.7-p17。

ところが(なのかな?)Rails 2.0.2にも同じバグがあって、これも顕在化した。よって、次のようになるのは1.8.7を1.8.7-p17にしても変わりない。

$ ./script/console
Loading development environment (Rails 2.0.2)
>> "" + ActiveSupport::Multibyte::Chars.new("")
ArgumentError: wrong number of arguments (2 for 1)
	from (irb):1:in `respond_to?'
	from (irb):1:in `+'
	from (irb):1
>>

つまりこれはActiveSupport::Multibyte::Charsで定義されているrespond_to?が引数を一つしか取らないからで、これを二つ取るようにすればよい。というわけで、config/initializers/fix_multibyte_chars_respond_to.rbというようなファイルを以下の内容で作ることで回避できるような気がする。

if defined?(ActiveSupport) &&
    defined?(ActiveSupport::Multibyte) &&
    defined?(ActiveSupport::Multibyte::Chars)
  mc = ActiveSupport::Multibyte::Chars.new("")
  begin
    "" + mc
  rescue ArgumentError
    raise unless mc.method(:respond_to?).arity == 1 
    class ActiveSupport::Multibyte::Chars
      def respond_to?(method, ip = false) 
        super || @string.respond_to?(method, ip) || handler.respond_to?(method, ip) ||
          (method.to_s =~ /(.*)!/ && handler.respond_to?($1, ip)) || false
      end
    end
  end
end
トラックバック

トラックバックリンク:
http://arika.org/diary/trackbacks?article_id=2448