carrierwaveで画像アップローダーを作成する

こんにちは、インターンの@ij_spitzです。
最近、Railsでいろんなgemを使って開発することに楽しみを覚えてきました。

ということで、今回は僕が画像をアップローダーを作成する際に使った、carrierwaveというgemを紹介したいと思います。
これです→
https://github.com/carrierwaveuploader/carrierwave


今回作るアップローダーはユーザーが複数の写真を保存できる仕様にしたかったので、モデルも併せて少し書き加えました。

carrierwaveのインストール
# Gemfile
gem 'carrierwave'

$ bundle install
下準備

1. アップローダーの作成

$ rails g uploader image

app/uploaders/image_uploaders.rbという、アップローダーの設定ファイルが作成されます。
設定については以下の記事が詳しいです。
http://www.workabroad.jp/tech/1118

2. 写真を保存する用のモデルを作成

$ rails g model member_image image:string member_id:integer
$ rake db:migrate

3. アップローダーをモデルにマウント

# member_image.rb
class MemberImage < ActiveRecord::Base
    mount_uploader :image, ImageUploader
end

4. モデル間のリレーションを作成(ユーザー : 写真 = 1 : 多)

# member.rb
class Member < ActiveRecord::Base
    has_many :member_images
end

# member_image.rb
class MemberImage < ActiveRecord::Base
    belogns_to :member
    mount_uploader :image, ImageUploader
end

リレーションの名前が片方だけ単数で片方だけ複数なことに注意しましょう。

最後にコントローラーとビューの作成

1. コントローラー

def edit
    @image = MemberImage.new
end

def upload
    @image = MemberImage.create({
        :member_id => params[:id], # member_id
        :image => params[:member_image][:image]
    })
end


2. ビュー

<%= form_for(@image, :url => update_image_member_path(:id => params[:id])) do |f| %>
    <%= f.label :image, '写真をアップロード' %>
    <%= f.file_field :image %>
    <%= f.submit '送信' %>
<% end %>

以上で基本的なアップローダーは完成です。

一番驚いたことは写真を保存する処理をどこにも書いていないのに、
画像がちゃんと保存されていたことです。
モデルにアップローダーがマウントされているため、
saveやcreateされたときに自動でアップされるという仕組みになっています。
これを利用すれば、アップロードされていない画像でも
carriewaveで保存して管理することが出来ます。



carrierwaveについて調べていると、Rmagickなどを併せて使う記事がたくさんありました。
画像のリサイズなども簡単にできるので、ぜひ併せて使ってみてください。