web-dev-qa-db-ja.com

Ruby Tempfileに書き込む方法

Tempfileを作成し、それにテキストを書き込もうとしています。しかし、Rails console

t = Tempfile.new("test_temp") # => #<File:/tmp/test_temp20130805-28300-1u5g9dv-0>
t << "Test data"              # => #<File:/tmp/test_temp20130805-28300-1u5g9dv-0>
t.write("test data")          # => 9
IO.read t.path                # => ""

私も試してみましたcat /tmp/test_temp20130805-28300-1u5g9dv-0しかし、ファイルは空です

私は何かが欠けていますか?または、Tempfileに書き込む適切な方法は何ですか?

参考までに、私はRuby 1.8.7およびRails 2.3.12

32
shiva

一時ファイルに書き込んだ後、一時ファイルを閉じたいと思うでしょう。最後にt.closeを追加するだけです。ファイルの出力がバッファリングされたに違いありません。

41
squiguy

この実行を試してくださいt.rewind読む前に

require 'tempfile'
t = Tempfile.new("test_temp")
t << "Test data"
t.write("test data") # => 9
IO.read t.path # => ""
t.rewind
IO.read t.path # => "Test datatest data"
19
Debadatt

closeまたはrewindは実際にファイルにコンテンツを書き出します。また、次の使用後に削除することもできます。

file = Tempfile.new('test_temp')
begin
  file.write <<~FILE
    Test data
    test data
  FILE
  file.close

  puts IO.read(file.path) #=> Test data\ntestdata\n
ensure
  file.delete
end
7
Lev Lukomsky

言及する価値はあります。.rewindを呼び出すことは必須です。そうでない場合、後続の.read呼び出しは空の値を返すだけです。

6
Artur Beljajev