Jun's Blog

Output, activities, memo and etc.

Ruby: the error at REXML::Document#write

以下の環境です。

$ ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-solaris2]

こんなコードを書くと、

...略
    f = open(@path, "w")
    doc = REXML::Document.new
...略
    #doc.write(f) # エラーにならない
    doc.write(f, INDENT_SPACES, true, true) # エラー
    f.close
...略

REXML::Document#write で、以下のようなエラーメッセージを出力します。

$ ruby script/runner -e development batch/create_site_map_page.rb
/opt/local/lib/ruby/1.8/rexml/document.rb:186:in `write': undefined local variable or method `transitive' for  ... :REXML::Document (NameError)
        from /...略.../lib/site_map_page.rb:52:in `save'
        from batch/create_site_map_page.rb:27
        from /opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `eval'
        from /opt/local/lib/ruby/gems/1.8/gems/rails-2.3.2/lib/commands/runner.rb:46
        from /opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
        from /opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from script/runner:3

なんかREXMLのバグのようなんですよね。

NameError: undefined local variable or method 'transitive' in document.rb, line number 187
http://trac.germane-software.com//rexml/ticket/115

writeの二個目の引数が-1より大きいときに起きるバグ。
transitiveという変数をtransに変更すれば、直りそう。

/opt/local/lib/ruby/1.8/rexml/document.rb

...略
  def write( output=$stdout, indent=-1, trans=false, ie_hack=false )
    if xml_decl.encoding != "UTF-8" && !output.kind_of?(Output)
      output = Output.new( output, xml_decl.encoding )
    end
    formatter = if indent > -1
      if transitive
...略

さてどうするかなー。

  1. ruby に上記バグのパッチ当てる
  2. ruby自体のバージョンをあげる
  3. 他のXMLパーサーを使う

もうどうせなら、ruby 1.9 を入れたい気分だ。