【rails】carrierwaveを使って画像アップロード機能を追加する
はじめに
railsアプリにcarrierwave
を使って画像アップロード機能を追加する方法について
設定方法
まず、Gemfileにcarrierwave
を記載して、bundle install
します。
gem 'carrierwave'
続いて、下記コマンドでアップローダーを生成。
$ rails g uploader <カラム名> $ rails g uploader avatar
生成されたアップローダーに下記の設定をします。
class BoardImageUploader < CarrierWave::Uploader::Base def default_url ※デフォルトの画像、画像がアップロードされなかった場合この画像が表示されるので、ビュー側でif文を書かなくて済む sample.jpg end def extension_whitelist ※アップロード可能なファイル種別 %w[jpg jpeg gif png] end end
続いて、アップロード先のフォルダ(/public/uploads)を.gitignore
に登録。
/public/uploads
続いて、該当のテーブルに画像カラムを追加します。
$ rails g migration AddAvatarToUsers avatar:string $ rails db:migrate
該当のモデルにアップローダーの使用を宣言します。
class User < ApplicationRecord mount_uploader :avatar, AvatarUploader end
続いて、ビューに画像を更新できるようフォームを追加します。
<div class="form-group"> <%= f.label :avatar %> <%= f.file_field :avatar, class: 'form-control mb-3', accept: 'image/*' %> <%= f.hidden_field :avatar_cache %> </div>
<%= f.hidden_field :avatar_cache %>
は、
もし画像をアップロードして、他のカラムのバリデーションに引っ掛かり更新に失敗した場合に、
一度アップロードした画像をキャッシュしておくためのコードです。
最後に、ストロングパラメータに画像カラムのavatar
とavatar_cache
を追加します。
def user_params params.require(:user).permit(:last_name, :first_name, :email, :avator, :avator_cache) end