BitArts Blog

ロードバイク通勤のRubyプログラマで伊豆ダイバー。の個人的なブログ。

(Rails)attachment_fuがWindows上でうまく動かない件

結構ハマった。

こんな症状↓

Rails 2.3.4でattachment_fuを使ってデータベースのbinaryフィールド(PostgreSQLのbytea)に画像を登録しようとすると、なぜかsizeが記録されずvalidates_as_attachmentを通らない。Model#save前にModel#valid?を呼ぶとうまくいったりする。しかし登録された画像データは内容が半分くらい欠落した破損データになっている。

データの壊れ方がテキストモードのままファイルopenしてるっぽいような気がしたので、試しにLinuxで同じことをしてみたら問題なかった。やはりどうやらWindowsだけの問題みたい。

このへんに情報あった。↓

で、結局、environment.rbの最後に次のようなコードを追加することで修正問題回避することができた。

# Fixing attachment_fu on Windows
class Tempfile
  def size
    if @tmpfile
      @tmpfile.fsync # added this line
      @tmpfile.flush
      @tmpfile.stat.size
    else
      0
    end
  end
end
module Technoweenie
  module AttachmentFu
    module InstanceMethods
      def temp_data
        save_attachment? ? File.open(temp_path, "rb"){|f| f.read} : nil
      end
    end
  end
end