Temfile2010/01/14

Tempfile

クラスの継承リスト: Tempfile < File  < IO  < Enumerable  < File::Constants  < Object  < Kernel

であるにも関わらず、

irb(main):001:0> tempfile = Tempfile.new('basename')
=> #<File:xxxx>
irb(main):002:0> tempfile.class
=> Tempfile
irb(main):003:0> tempfile.kind_of? IO
=> false
irb(main):004:0> tempfile.kind_of? File
=> false

になるのはどうして? 教えて偉いひと。

方法は判るけど、理由が判らない……。

Mechanizeでファイルを送信しようとした時に、Tempfileのインスタンスを渡すと どうしても Content-Type が 'multipart/form-data' にならないなあと思ったら、 これが原因だった。

具体的には、 WWW::Mechanize#post で、クエリの value に is_a?(IO) を訊いている。 ここで、value が Tempfile だと false が返って 'application/x-www-form-urlencoded' で送信されてしまう。

とりあえず、急ぎだったので、

--       if v.is_a?(IO)
++       if v.is_a?(IO) || v.is_a?(Tempfile)

な感じで逃げる。