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などを併せて使う記事がたくさんありました。
画像のリサイズなども簡単にできるので、ぜひ併せて使ってみてください。