Railsでファイルアップロード用フィールドを作る時の注意点

 Railsでfile_fieldを使ってファイルアップロード用のフィールドを作るとする。今回はpdfをアップロードできるようにしたかったので、<%= file_field 'report', 'pdf' %>とした。
 で、Report.rbの方にpdf=というメソッドを定義すると自動的にアップロード時にそれを呼んでくれる。引数としてはアップロードされたファイルが渡ってくる。この引数は、Firefoxの場合もSafariの場合も、ともにクラスはTempfileで、content-typeはapplication/pdfである。普通にファイルをアップロードしている分には、なんの問題もない。
 問題があるのは、ファイルアップロード用のフィールドでアップロードするファイルを指定しなかった場合である。Firefoxだと、ファイルを指定しなかった場合はStringIOが渡ってくる。content-typeはapplication/octet-streamである。Safariの場合は、Stringが渡ってくる。content-typeはない、というか、content_typeを呼ぶとNo method errorになる。
 あと、ファイルがアップロードされたかどうかの判定はnil?では行わずsize == 0、もしくはblank?で行いましょう。
 さて、この3行ほどの修正を反映しに、30分かけて研究室まで行きますか…。(´・ω・`)