Rails 2.0.2とRuby 1.8.7のString#chars
Ruby 1.8.7からはString#chars
が定義されるようになった。これがRails 2.0.2なんかではまずくって、たとえば"hello".first
でNoMethodError: undefined method `[]' for #<Enumerable::Enumerator:0xb6f3f5b4>
などとなる。これはRailsのように積極的に組み込みクラスを改変しているものの定めといえる。
Rails 2.1.0を見てみると以下のようになっていて、Ruby 1.8.7のString#chars
を削除し、Rails(ActiveSupport)が定義しているchars
を使おうとしている。
module ActiveSupport #:nodoc: module CoreExtensions #:nodoc: module String #:nodoc: unless '1.9'.respond_to?(:force_encoding) # Define methods for handling unicode data. module Unicode def self.append_features(base) if '1.8.7'.respond_to?(:chars) base.class_eval { remove_method :chars } end super end [...]
Rails 2.0.2でも同じようにするには、Rails側に手を入れたほうがてっとり早いとは思うのだが、ひとまずそれはしないことにするならばconfig/initializers/removestringchars.rb
を以下の内容で作っておくというやり方はどうだろう。
unless '1.9'.respond_to?(:force_encoding) String.class_eval do begin remove_method :chars rescue NameError # OK end end end
script/console
やscript/server
(アプリケーションはTracks-1.6)で簡単な動作確認をしてみたところ、ひとまず前述の例外を回避できているようだ(Ruby 1.8.7、1.8.7-p17および1.8.6で確認した)。ただしそれ以外の環境やアプリケーションでどうなるかは確認していない。