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

ファイルの保存場所を指定する。ファイルストレージならファイルの保存場所。