file_columnプラグインを使ってみる・後

In: Ruby / Rails| technology

13 2月 2008

前回の続きになります。まずは前回のあらすじ。
画像のアップロードはできたみたいだけど、こんな風に出ました。

orz

画像を表示させる

もったいぶってしまいましたが、結論から言えば、表示させたいページのrhtmlに以下のコードを入れるだけです。

< %= image_tag url_for_file_column(@image, :image) %>

画像が出た状態

簡単の一言ですね。

前回、サムネイル用のものも作るように設定しましたが、それを出したいときは、コードをこう書き換えればいいです。

< %= image_tag url_for_image_column(@image, :image, :thumb) %>

TPOに応じて使いこなせればステキですね。

とはいえ

さすがにこれだけだと、引っ張った意味があんまりないので。。。
使ってみてわかった仕様的なところを補足してみます。

1) 画像の保存先について。

画像については、

public/#テーブル名/#カラム名/#id/#アップロード時のファイル名+拡張子

で保存されます。

また、アップロード時の設定でオリジナルファイル以外の保存も行うようにした場合(前回の:thumbで指定した場合なんかがそれにあたりますね)、

public/#テーブル名(単数形)/#カラム名/#id/thumb/#アップロード時のファイル名+拡張子

といった形になります。
:thumbに関しては、違う名前にしたり、複数のバージョンを作ったりすることも可能です。

つまるところ、アップロードのタイミングで、各設定に応じた画像を自動で作って保存して持っておいてくれるようになっているわけですね。

2) テーブルとの関係

前回のテーブル設計ではさらっと流しましたが、カラムにBLOBなどのLOB型のものを作る必要はありません。
アップロードしたファイルのパスを持たせるためのカラムがあればよいです。
サンプルではVARCHAR(255)で作っただけのカラムを使っていますが、カラムの属性はVARCHARでないといけません。

サンプルの画像でもimageカラムには、変な画像のパスがちらっと出てますが、MySQL QueryBrowserなどで見てみると、「#アップロード時のファイル名+拡張子」の部分しか入ってなかったりします。
たとえば、手動で登録するようなことがあった場合、ファイル名だけきちんと入っていて、パスも(1)の項で解説したとおりの場所に保存されていれば問題はないみたいです(プラグインの意味があまりないかもしれませんが)。

3) ActiveRecordのdestoryメソッドとの関係

今回、単純にscaffoldで作っただけですが、ためしに作成したレコードを削除してみたら、登録してあったファイルも一緒に削除されました。
これは、file_columnで指定したカラムには、自動的に画像の扱いに関する処理も含まれるような仕組みになっていて、実装者は、あまり意識しなくても、直感的に画像ファイルを取り扱えるようにしてあります。
レコードの削除前にわざわざ画像の削除用のメソッドとかをはさまなくてもいいとは、なかなか心憎い仕組みです。

4) アップロードできる拡張子

いろいろ試してみましたが、画像系の拡張子以外はしないでおいたほうがよさそう、というのが現時点での結論です。
zipとかxlsとかpdfとかが上げられたら、簡易のうpろだみたいにできるかとも期待したんですが、早々うまくはできてないみたいです(でも、拡張子ごとのhashが用意されているから、うまくやればできるのかも?)。

確認できた範囲では、デフォルトでは、zipは途中で失敗、pdfは登録できたけどファイルが消滅、という憂き目に。
上げられたくない拡張子はきちんとバリデーションではじくようにしたいところです。

ちなみに、アップロードに失敗した場合、その一時ファイルはpublic/#テーブル名(単数形)/#カラム名/tmpの中に残ります。
で、アップロードが完了すると(レコードが登録できると)、晴れてtmpの中身からいなくなる、という仕組み。
そのため、うまくいかないからって言って、途中で処理をやめちゃうとずーっとゴミが残り続けます。
実際にサービスに乗っけて使うときは、ガベージ的なバッチ処理がほしい気がします。

5) アップロードした時点でのパーミッション

「644」がデフォルトです。実行権限はどのユーザーにもついていません。
ほかのに変えたいときは、どこかしらで手を加える必要がありそうです。
どこが望ましいんだろう?

 

今回は、file_column.rb内のドキュメントなどを翻訳しながら参照してみたので、間違っている部分もあるかもしれませんので、ご了承ください。
よろしければ、ぜひ、間違いのお知らせを。

また、file_columnの内部構造については、下記のサイトがとても参考になりました。
あわせて参考に、ということでリンクを貼っておきまーす。

Via:


Comment Form

About this blog

ゆるーく、ふわーっと、興味のままに。

自分のかたわらに置いておくメモ代わり。

Photostream