CarrierWaveメモ(WIP)
WIP
画像アップロード機能を追加するGem。CarrierWave 2.2.0 で確認。
以下のgemを追加する。
gem 'carrierwave', '~> 2.0'
基本的な使い方
bin/rails g uploader Avatar
で以下のファイルが作成される。Avatar
はアップローダー名なので任意。
app/uploaders/avatar_uploader.rb
bin/rails g migration add_avatar_to_users avatar:string
を実行して、ファイルを紐づけるテーブルにカラムを追加する。カラム名はavatar
としているが任意でアップローダー名と異なるカラムを指定しても良い。
次にファイルを紐づけるモデルにmount_uploader ...
を追加する。
class User < ApplicationRecord
# 第一引数はカラム名
# 第二引数はアップローダーのクラス
mount_uploader :avatar, AvatarUploader
end
以上で準備は整ったので、以下のような形で使うことができる。
user = User.new
user.avatar = params[:file]
user.save
user.avatar.url # => /uploads/user/avatar/userのID/ファイル名
# コンソールから試す場合
user = User.new
File.open('ファイル名') { |f| user.avatar = f }
user.save
ファイルは、デフォルトでは/public/uploads/モデル名/カラム名/モデルのID/ファイル名
に保存されていく。
オーバーライドするアップローダメソッド
アップローダクラスはテンプレートメソッドパターンで設定などを差し込む形になっている。
./lib/generators/templates/uploader.rb: # Override the directory where uploaded files will be stored.
./lib/generators/templates/uploader.rb- def store_dir
./lib/carrierwave/uploader/default_url.rb: # Override this method in your uploader to provide a default url
./lib/carrierwave/uploader/default_url.rb- def default_url(*args); end
./lib/carrierwave/uploader/content_type_whitelist.rb: # Override this method in your uploader to provide an allowlist of files content types
./lib/carrierwave/uploader/content_type_whitelist.rb- def content_type_allowlist
./lib/carrierwave/uploader/extension_blacklist.rb: # Override this method in your uploader to provide a denylist of extensions which
./lib/carrierwave/uploader/extension_blacklist.rb- def extension_denylist
./lib/carrierwave/uploader/file_size.rb: # Override this method in your uploader to provide a Range of Size which
./lib/carrierwave/uploader/file_size.rb- def size_range; end
./lib/carrierwave/uploader/store.rb: # Override this in your Uploader to change the filename.
./lib/carrierwave/uploader/store.rb- def filename
./lib/carrierwave/uploader/content_type_blacklist.rb: # Override this method in your uploader to provide a denylist of files content types
./lib/carrierwave/uploader/content_type_blacklist.rb- def content_type_denylist
./lib/carrierwave/uploader/extension_whitelist.rb: # Override this method in your uploader to provide an allowlist of extensions which
./lib/carrierwave/uploader/extension_whitelist.rb- def extension_allowlist
store_dir
ファイルの保存場所を指定する。ファイルストレージならファイルの保存場所。