I've been having a ton of problems handling file uploads with CGI.rb 
and after diving into the code, it looks like my woes can be narrowed 
down to these lines in the read_multipart method:

if 10240 < content_length
   require "tempfile"
   body = Tempfile.new("CGI")
else
   begin
     require "stringio"
     body = StringIO.new
   rescue LoadError
     require "tempfile"
     body = Tempfile.new("CGI")
   end
end

It sure looks like the sole differentiator on whether a request should 
be treated with StringIOs or Tempfiles is the size of the request. If 
this understanding is correct, I have no trouble understanding why I've 
been pulling out my hair in frustration the last couple or many hours.

If I upload just one file that brings the content_length above 10240, 
ALL fields in the request is treated as Tempfiles. If I'm uploading a 
small file that keeps the content_length below 10240, all the fields -- 
including the file -- is treated as StringIOs.

For starters, how would one move a small file, treated as StringIO, to 
another location? With Tempfile, you just do Tempfile#local_path, and 
move away. But it's not so straight forward with StringIO.

It also seems very tedious that the application has to know whether the 
file upload was big or small and act accordingly.

Maybe I'm just missing something. Like that StringIO and Tempfile is 
supposed to act the same and they just don't on my system for some 
reason. Or this is a bug.

Since my last cries for help haven't been overly succesful, I gather 
that most consider CGI.rb to be a black box as well. So perhaps I 
should get in touch with the original author. Does anyone know if Wakou 
Aoyama is still actively maintaining CGI.rb?
--
David Heinemeier Hansson.
http://www.loudthinking.com/ -- Broadcasting Brain