概要
ファイルアップロード機能を提供するGem。
いろいろなアップロード機能を提供するGemはあるが、その中の一つ。
導入手順
まずはGemfileに追加。
gem 'carrierwave', '~> 2.0'
uploaderクラスを作成。
rails generate uploader Avatar
そうすると以下のファイルが作成される。
app/uploaders/avatar_uploader.rb
class AvatarUploader < CarrierWave::Uploader::Base
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
def default_url
'sample.jpg'
end
def extension_allowlist
%w(jpg jpeg gif png)
end
end
次に以下のコマンドで画像を保存するカラムを作成する。
rails g migration add_avatar_to_users avatar:string
rails db:migrate
これだと該当のテーブルに画像カラムを作成しているが、画像を複数保存する場合は画像保存ように別テーブルを作成することをお勧めする。
(一応、公式でもMultiple file uploadsにてJSON型のカラムを作り、そこに複数件保存するよう書かれているが、ハッシュ化までは考慮されていない。)
参考記事[1]
次にモデルに以下を追加する。
class User < ApplicationRecord
mount_uploader :avatar, AvatarUploader
end
これによりレコードの保存時に自動的に画像ファイルをpublic/uploads配下に保存できるようになる。そして、DBのavatarカラムには画像ファイル名のみ保存される。
しかし、これだけではファイルがそのままの名前で保存されるので、uploaderクラスでfilenameメソッドを定義し、ハッシュ化することをお勧めする。
参考記事[2]
そして、コントローラーにパラメーターとして追加する。
params.require(:user).permit(:email, :last_name, :first_name, :avatar)
最後にview側
投稿フォーム
<%= f.file_field :avatar %>
表示方法
<%= image_tag(@user.avatar_url) if @user.avatar? %>