【Rails】Carrierwave(gem)について
はじめに
画像アップロードのGem Carrierwaveの導入方法を記録しておきます。
手順
- アップローダーを作成し、
- それをモデルで使用するように宣言した上で、
- 実際にアップロード作業を行う
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' %>