2007/02/14

file_column and capistrano

Railsで画像ファイルをアップロードする場合、file_columnというプラグインがとても使えます。
このpluginは、画像のアップロード、保存、サムネイル作成といった面倒な処理を劇的に簡略化してくれます。

データベースにファイル名を保存するカラムを追加し、

add_column :entry, :image, :string

モデルで、file_column pluginを指定します。

class Entry < ActiveRecord::Base
  file_column :image
end

この場合の保存先は、
public/[model_name]/[attribute_name]/[id]/[file_name].jpg
になります。

サムネイルを作成する場合は、次のようにします。

class Entry < ActiveRecord::Base
  file_column :image, 
    :magick => {
      :versions => {
        :thumb => "50x50",
        :midle => "100x100",
        :large => "800x600"
      }
    }
end

この場合はそれぞれ、
public/[model_name]/[attribute_name]/[id]/[file_name].jpg
public/[model_name]/[attribute_name]/[id]/thumb/[file_name].jpg
public/[model_name]/[attribute_name]/[id]/midle/[file_name].jpg
public/[model_name]/[attribute_name]/[id]/large/[file_name].jpg
に保存されます。

ファイルをアップロードするには以下のhelperを使用します。

<%= file_column_field "entry", "image" %>

アップロードした画像を表示するには、以下のhelperを使用します。

<%= url_for_file_column "entry", "image" %>

サムネイルを表示するには、
<%= url_for_file_column "entry", "image", "thumb" %>

上記のように簡単に、非常に簡単に画像処理を扱えるようになるわけですが、capistranoでデプロイしている場合、画像の保存先がデフォルトのままだと、デプロイするたびに画像ファイルをコピーしなければなりません。
これではあんまりですが、ちゃんと回避策がありました。
file_columnのオプションに、root_pathというのがありまして、デフォルトの保存先を変更できます。
以下のように、capistranoが自動でリンクしてくれるsystemディレクトリに画像を保存するように指定すれば、いちいちコピーしなくてもよさそうです。

class Entry < ActiveRecord::Base
  file_column :image, 
    :magick => {
      :versions => {
        :thumb => "50x50",
        :midle => "100x100",
        :large => "800x600"
      }
    }, 
    :web_root => "system/files/", 
    :root_path => File.join(RAILS_ROOT, "public", "system", "files")
end


参考:
HowToUseFileColumn

automatically translated by Google Translate Hack!