- 追加された行はこの色です。
- 削除された行はこの色です。
&tag(CarrierWave);
*目次 [#m00f5025]
#contents
*関連ページ [#xb0b63f5]
*参考情報 [#tc3a51e3]
-[[carrierwaveuploader/carrierwave:https://github.com/carrierwaveuploader/carrierwave]] …公式サイト
-[[Rails 超お手軽な画像アップローダー CarrierWave の使い方 | Workabroad.jp:http://www.workabroad.jp/tech/1118]]
*デモプロジェクトの作成 [#i2ddbd9e]
**Gemfile [#r4f528c7]
-以下を追加し、bundle updateを実行
#pre{{
gem 'carrierwave'
gem 'rmagick'
}}
**準備 [#p5aff167]
-アップローダーの生成
#pre{{
$ bundle exec rails g uploader image
}}
-マイグレーションファイル
#pre{{
$ bundle exec rails g migration add_image_to_books image:string
#=> db/migrate/xxxxx_add_image_to_users.rbが生成される。
}}
-マイグレーション実行。Booksテーブルにimageカラムが追加される。imageカラムにはファイル名が保存される。
#pre{{
$ bundle exec rake db:migrate
}}
-Bookモデルにアップローダーをマウント。
#pre{{
class Book < ActiveRecord::Base
validates :title, :presence => true
# 下記を追加
mount_uploader :image, ImageUploader
end
}}
-controllerを変更。
#pre{{
def book_params
params.require(:book).permit(:title, :author, :summary, :image)
end
}}
** Uploaderの修正 [#u0b82161]
-app/uploaders/image_uploader.rbを編集し、画像サイズや、ファイルの保管場所などの設定を行う。
** Viewの編集 [#zc0b238d]
-編集画面。
#pre{{
<%= form_for(@book) do |f| %>
(...省略...)
<%= f.label :image %>
<%= f.file_field :image %>
(...省略...)
<% end %>
}}
-表示画面。@book.image.<アップローダーで付けた縮小画像の名前>.urlでアクセス。
#pre{{
<% if @book.image? %>
<%= image_tag @book.image.s.url %>
<% else %>
画像がありません
<% end %>
}}
*Tips [#lbb680c6]
**ちょっとだけ異なるUploaderを作りたい。 [#pa89bc25]
-例えばimage1とimage2でベースとなるファイル名だけ変えたい場合。CarrierWave::Uploader::Baseを継承したベースクラスを作りそこからさらに継承するのはできない(仕様上うまく動かないらしい)。
-Uploaderからカラム名などにアクセスできるのでそれを使うのが簡単かも。例えばカラム名をそのままファイル名に使いたい場合、mount_asが使える。
--book.rb
#pre{{
class Book < ActiveRecord::Base
validates :title, :presence => true
# 下記を追加
mount_uploader :image, ImageUploader
mount_uploader :image2, ImageUploader
end
}}
--image_uploader.rb。マウントされたカラムによってファイル名が変わる。
#pre{{
def filename
# "image1.jpg" or "image2.jpg"
"#{mounted_as}.jpg"
end
}}
**縮小すると画質が劣化する [#k3c45421]
-[[How to: Specify the image quality · carrierwaveuploader/carrierwave Wiki:https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Specify-the-image-quality]]にある方法でqualityは指定できる(があまり影響なし?)。それだけでなくunsharp_maskも指定したほうがいいかも。config/initializers/carrierwave.rbを作成。
#pre{{
module CarrierWave
module RMagick
def quality(percentage)
manipulate! do |img|
img.write(current_path){ self.quality = percentage } unless img.quality == percentage
img = yield(img) if block_given?
img
end
end
# reduce image noise and reduce detail levels
#
# process :blur => [0, 8]
#
def blur(radius, sigma)
manipulate! do |img|
img = img.blur_image(radius, sigma)
img = yield(img) if block_given?
img
end
end
def unsharp_mask(radius, sigma, amount, threshold)
manipulate! do |img|
img = img.unsharp_mask(radius, sigma, amount, threshold)
img = yield(img) if block_given?
img
end
end
end
end
}}
-ImageUploaderで指定する。ImageMagicの縮小オプションだと「convert -quality 90 -unsharp 2x1.4+0.5+0 -resize 560x560」に相当?
#pre{{
class ImageUploader < CarrierWave::Uploader::Base
version :m do
process :resize_to_limit => [560, 560]
process :quality => 90
process :unsharp_mask => [2, 1.4, 0.5, 0]
end
end
}}