【Rails】Carrierwave(gem)について

はじめに

画像アップロードのGem Carrierwaveの導入方法を記録しておきます。

手順

  1. アップローダーを作成し、
  2. それをモデルで使用するように宣言した上で、
  3. 実際にアップロード作業を行う
Gemfileの設定
gem 'carrierwave'
$ bundle install
アップローダーの作成
$ rails g uploader image //アップローダーを作成

app/uploaders/image_uploader.rb //ファイルが作成されます

実行後、app/uploaders 下に image_uploader.rbが作成されます。

カラムの作成
$ rails g migration add_image_to_board image:string

マイグレーションファイル

class AddBoardImageToBoard < ActiveRecord::Migration[5.2]
  def change
    add_column :boards, :board_image, :string
  end
end
$ rails db:migrate
アップローダーをマウントする
class Board < ApplicationRecord
  mount_uploader :image, ImageUploader
end
image_uploader.rbの編集(コメント部分をコメントアウトして設定した)
class ImageUploader < CarrierWave::Uploader::Base

include CarrierWave::MiniMagick
process resize_to_fit: [300, 200] # 画像のリサイズ
  
  storage :file

# データの保存先
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

# default画像の設定
  def default_url
    'board_placeholder.png'
  end

# アップロードできるファイルの制限
  def extension_whitelist
    %w[jpg jpeg gif png]
  end

end
フォームの設定
<div class="form-group">
          <%= f.label :image %>
          <%= f.file_field :image,  class: 'form-control mb-3'%>
          <%# アップロードに失敗した際もファイルが消えないようにするための記述 %>
          <%= f.hidden_field :board_image_cache %>
</div>
ビューに画像表示(例)
<%= image_tag board.board_image.url, class: 'card-img-top' %>