carrierwaveによる画像アップロード機能

画像アップロード

インストール
gem 'carrierwave'
$ bundle install --path vendor/bundle
アップローダの生成
$ rails generate uploader Icon
アップローダファイル
class IconUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick  # ActiveStorageの画像加工用モジュール

  storage :file

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  # 画像置き場のディレクトリ
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  # 画像がアップロードされていないときのデフォルト画像
  def default_url
    'sample.jpg'
  end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  # 許容するファイル形式
  def extension_whitelist
    %w[jpg jpeg gif png]
  end
end
モデル

usersテーブルにiconカラムがある前提

class User < ActiveRecord::Base
  mount_uploader :icon, IconUploader
end
# 画像の関連付け
user.icon = params[:file]
user.save!

# 画像URIの取得
user.icon.url # => '/url/to/file.png'
user.icon.current_path # => 'path/to/file.png'
user.icon_identifier # => 'file.png'
ビュー

アップロードフォーム

<%= f.file_field :icon %>

画像の表示

<%= image_tag(@user.icon_url) if @user.icon? %>

gitignoreの記述

すでにファイルをコミットしてからgitignoreを追記した場合コミット後にgit rm --cached ファイル名コマンドでgitの管理対象外に設定する
また不要なファイルをpushしてしまった場合は、git rm ファイル名コマンドでリモートリポジトリから削除する必要がある

# .gitignore
/vendor
/public/uploads