Fleximage プラグインを使う

Fleximage は画像アップロード、サムネイル表示を行うためのRailsプラグインです。要RMagick。
script/plugin install git://githun.com/Squeegy/fleximage.git でインストールしようにもうまくいかなかったので直接ダウンロードしてきて app/vender/plugin に入れました。

とりあえずの scaffold

filename, width, height は画像アップロードの際に値が自動で入ります。参考サイトにあるようにモデルで保存先のディレクトリを指定します。

script/generate scaffold picture title:string description:string image_filename:string image_width:integer image_height:integer
rake db:migrate

アップロードフォームを作るために app/views/pictures/new.html.erb を以下の様に編集。multipart を指定するには :multipart => true 。

<% form_for(@picture, :html => {:multipart => true}) do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :description %><br />
    <%= f.text_field :description %>
  </p>

  <p>
    <%= f.label :image_file %><br />
    <%= f.file_field :image_file %>
  </p>
  <p>
    <%= f.submit "Create" %>
  </p>
<% end %>

<%= link_to 'Back', pictures_path %>

画像の表示

show で画像を表示させるとして、 app/views/pictures/show.html.erb の表示させたい箇所に以下の内容を記述する。

<%= image_tag formatted_picture_url(@picture, :png) %>

コントローラでは app/controllers/pictures_controller.rb の showメソッドの respond_to 部分に format.png を追加して png フォーマットのリクエストを受け付けるようにする。
png フォーマットのビューは action.format.flexi の形式になる。今回の例では view.png.flexi となる。こんな感じで柔軟に設定できる所が良い所。view.png.flexi は以下の様に作成する。image に対して image.resize( '100x100' ) とかすればリサイズされて表示できる。

@picture.operate do |image|
end

ここにはポラロイド調にする方法とか書いてあって面白い。
ひと通り終了。次はタグ分けとかやってみる。さくらでRails の遅さが半端ないです。gateway.cgi 入れてみよう。