0
0

More than 1 year has passed since last update.

複数画像を想定したCarrierWaveの使い方

Last updated at Posted at 2022-07-17

概要

ファイルアップロード機能を提供する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? %>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0