Gemfileにcarrierwave追加
# gem
gem 'carrierwave', '~> 2.0'
アップローダークラスの生成
bundle exec rails g uploader アップローダー名
# bundle exec rails g uploader Image
デフォルトでstorage :fileが指定されているので、アップロードしたファイルはpublic/配下に保存されます。保存されるディレクトリは、store_dirで設定されます。
余談ですが、保存先は以下のstore/dirです。
app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
.
.
.
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
def extension_whitelist
%w(png jpg)
end
def filename
original_filename if original_filename
end
end
もし、例えばS3に変更したい場合は、'fog'というgemをインストールした上で、以下のファイルの設定を変更する。
config/initializers/carrierwave.rb
unless Rails.env.development? || Rails.env.test?
CarrierWave.configure do |config|
config.fog_credentials = {
provider: 'AWS',
aws_access_key_id: 'XXXXXXXX',
aws_secret_access_key: 'XXXXXXXXXXXXXXXXXXX',
region: 'ap-northeast-1'
}
config.fog_directory = 'rails-photo-123'
config.cache_storage = :fog
end
end
アップロード画像のカラムを追加
続いて、アップロード画像を保存したいモデルにカラムを追加する。
bundle exec rails g migration add_カラム名_to_users カラム名:string
# bundle exec rails g migration add_picture_to_users picture:string
このカラムには、「画像のデータ」ではなく「画像のファイル名」を保存します。カラムを追加する際もstringを指定するようにしましょう。
アップローダークラスとカラムの紐づけ
最後にアップローダークラスとカラム名を紐づければおわりです。簡単...
class モデル名 < ActiveRecord::Base
mount_uploader [:カラム名], [アップローダークラス]
# mount_uploader picture,Image
end