環境
- Mac(12.2.1)
- MacBook Pro (13-inch, 2020)
- 2 GHz クアッドコアIntel Core i5
- 16 GB 3733 MHz LPDDR4X
- ruby (3.0.0p0)
- rails (7.0.1)
- mysql2 (0.5.3)
- carrierwave (2.2.2)
はじめに
以前、できなかったが今回できた
前提知識
deviseを使用した上でのお話です
解決したい内容
ドキュメント通り進めていく
gem install carrierwave
gem 'carrierwave'
サーバーを再起動
carrierwaveの設定
Uploaderクラスを追加
ここではAvatarという名前にしているのが、好きな名前で良い
rails generate uploader Avatar
↓
class AvatarUploader < CarrierWave::Uploader::Base
storage :file
end
アップロード画像の情報を保存するavatarカラムを追加する為に、マイグレーションファイルを作成
アップロード画像の情報を保存するavatarカラムを追加する為に、マイグレーションファイルを作成
rails g migration add_avatar_to_users avatar:string
↓
class AddAvatarToUsers < ActiveRecord::Migration[7.0]
def change
add_column :users, :avatar, :string
end
end
rails db:migrate
画像を保管するカラムを作成
今回はユーザー画像として扱いたいと思うので、元々作ってあるUserモデルにavatarsカラム(=画像を補完するところ)を作成
rails g migration add_avatars_to_users avatars:json
rails db:migrate
↓
画像用モデルをcarrierwave用に修正する
Userモデルのavatarカラムにmount_uploaderを設定
つまり「アップロード画像用のカラム(avatarカラム)」と「アップローダークラス(AvatarUploaderクラス)」を紐づける
今回は、ユーザーのアバター画像のアップロード機能を追加するため、下記のように追記
class User < ApplicationRecord
mount_uploaders :avatars, AvatarUploader
end
deviseを使用している場合の設定
DBに保存できるようにaplication_controllerもしくはuser_controllerのストロングパラメータにavatarを追記する
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:user_id])
@user=User.find_by(params[:id])
#下記":avatar"追記
added_attrs = [ :email, :name, :password, :password_confirmation ,:avatar]
アバター画像の登録・表示
e.g.) ユーザー編集画面で画像を登録
<h2>Edit <%= resource_name.to_s.humanize %></h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
#追記
<%= f.file_field :avatar %>
・
・
・
表示
<%= image_tag current_user.avatar.to_s %>
改善策
No route matches CarrierWave
https://qiita.com/hatorijobs/items/50f23b3b8e4761914851
config/routes.rb のファイルの以下の部分に:update を追記
resources :users, only: [:show, :index, :destroy]
↓
resources :users, only: [:show, :index, :update, :destroy]
投稿ボタンを押した際、モデルのコントローラーのupdateアクションが実行されているので、ルーティングでupdateを許可しないと、通らないというわけである。
なぜ、updateアクションが実行されるのが分かったかというと、自分の場合は、手当たりしだいにブレークポイントを挿入してupdateアクションが実行されていることを発見しましたとのこと
NameError: uninitialized constant User::ImageUploader
# Load the Rails application.
require_relative "application"
# Initialize the Rails application.
Rails.application.initialize!
#これを追記
require 'carrierwave/orm/activerecord'
参考にした記事
URLの表示名
https://github.com/carrierwaveuploader/carrierwave
https://pikawaka.com/rails/carrierwave
https://qiita.com/hatorijobs/items/50f23b3b8e4761914851
https://qiita.com/tama_chi/items/bd07366c76f548512a3f