LoginSignup
0
1

More than 1 year has passed since last update.

【Rails】【メモ】carrierwaveの使い方

Posted at

環境

  • 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
Gemfile.rb
gem 'carrierwave'

サーバーを再起動

carrierwaveの設定

Uploaderクラスを追加
ここではAvatarという名前にしているのが、好きな名前で良い


rails generate uploader Avatar

app/uploaders/avatar_uploader.rb
class AvatarUploader < CarrierWave::Uploader::Base
  storage :file
end

アップロード画像の情報を保存するavatarカラムを追加する為に、マイグレーションファイルを作成

アップロード画像の情報を保存するavatarカラムを追加する為に、マイグレーションファイルを作成

rails g migration add_avatar_to_users avatar:string

db/migrate/20220409024134_add_avatar_to_users.rb
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クラス)」を紐づける
今回は、ユーザーのアバター画像のアップロード機能を追加するため、下記のように追記

app/models/user.rb
class User < ApplicationRecord
  mount_uploaders :avatars, AvatarUploader
end

deviseを使用している場合の設定

DBに保存できるようにaplication_controllerもしくはuser_controllerのストロングパラメータにavatarを追記する

app/controllers/application_controller.rb
  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.) ユーザー編集画面で画像を登録

app/views/devise/registrations/edit.html.erb
<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 を追記

config/routes.rb
resources :users, only: [:show, :index, :destroy]

config/routes.rb
resources :users, only: [:show, :index, :update, :destroy]

投稿ボタンを押した際、モデルのコントローラーのupdateアクションが実行されているので、ルーティングでupdateを許可しないと、通らないというわけである。

なぜ、updateアクションが実行されるのが分かったかというと、自分の場合は、手当たりしだいにブレークポイントを挿入してupdateアクションが実行されていることを発見しましたとのこと

NameError: uninitialized constant User::ImageUploader

config/environment.rb
# 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

0
1
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
1