##手順
①gem carrierwave
とmini_magick
をインストール
②uploaders/image_uploader.rbを作成
③uploadersとモデルの紐付けやデフォルト画像の設定、ファイル指定などの細かい設定
④モデルに新たなカラムを追加(例:Postモデルにpost_imageというカラムを新しく追加)
⑤viewの記入
⑥画像アップロードフォーム
⑦画像アップロードに関する日本語化の追加設定
##①gem carrierwave
とmini_magick
をインストール
###Carrierwaveとは
Carrierwaveとは、ファイルアップロード用のgem。
Ruby on Railsの画像投稿の仕組みで、よく使われるgemの1つ。
###MiniMagickとは
MiniMagickとは、画像処理ライブラリで、画像サイズ変更や画像反転などといった様々な画像処理を行うことができる。
前提として、 MiniMagickを使うにはImageMagickというものをインストールする必要があるので注意。
実行手順
#ターミナル
brew install imagemagick
#gemfile
gem 'carrierwave'
gem 'mini_magick'
→bundle install
##②uploaders/image_uploader.rbを作成
ターミナルで、rails g uploader image
コマンドを実行すると、
app/uploadersディレクトリ以下にimage_uploader.rbが作成
される。
#ターミナル
rails g uploader image
##③uploadersとモデルの紐付けやデフォルト画像の設定、ファイル指定などの細かい設定
###uploadersとモデルの紐付け
先ほど作成したアップローダーを関連するモデルと紐付け。
下記内容はモデルに記載。
#postモデルと紐付けた場合
class Post < ApplicationRecord
mount_uploader :image, ImageUploader
end
🔼imageカラム
にアップローダーを紐づけてますよという内容。
###画像リサイズ
image_uploader.rbを以下のように編集。
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process resize_to_fit: [400, 200]
end
###アップロード・デフォルト画像の設定
以下の設定をすると、登録時にファイル選択をしなかった場合、デフォルト画像をimageとして渡すことができる。
#アップロードした画像の表示
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
#デフォルト画像の設定
def default_url
"default.png" ←デフォルト画像に設定したい画像名を記入
end
※デフォルトにしたい画像はassets/images配下に保存すれば反映される。
###アップロードファイルの指定
image_uploader.rbを以下のように編集。
def extension_allowlist
%w(jpg jpeg gif png)
end
##④モデルに新たなカラムを追加(例:Postモデルにpost_imageというカラムを新しく追加)
テーブルに画像用のカラムを追加。
#ターミナル
rails g migration マイグレーション名
#新しく追加されたマイグレーション
class マイグレーション名 < ActiveRecord::Migration[5.2]
def up
add_column :追加先モデル名, :新しいカラム,:string
end
end
→その後、rails db:migrateを忘れずに
##⑤viewの記入
画像ファイルの表記法には2つあり、違いはリサイズの大きさか、オリジナルサイズかで変わってくる。
#アップローダーファイル
version :thumb do
process resize_to_fit: [200, 200]
end
version :thumb50 do
process resize_to_fit: [100, 100]
end
#リサイズ表記
<%= image_tag @user.image.thumb.url %>
↑ version :thumb do の方でリサイズしたサイズのサムネイル画像が表示される
#オリジナルサイズ表記
@user.image.url
##⑥画像アップロードフォーム
<%= f.label :post_image%>
<%= f.file_field :post_image%>
<%= f.hidden_field :post_image_cache %>
hidden属性でimage_cacheは、画像を指定したけれども、バリデーションエラーなどにより保存が失敗した場合の画面再表示時などに、画像情報をキャッシュしておくための領域。
※image_cacheカラムを新たに追加する必要あり
##⑦画像アップロードに関する日本語化の追加設定
config/locales/activerecord/ja.ymlを作成し新たなカラム名やエラー文の日本語化を追加。
CarrierWaveが出力するエラーの日本語化
※参考
ja:
errors:
messages:
carrierwave_processing_error: 処理できませんでした
carrierwave_integrity_error: は許可されていないファイルタイプです
carrierwave_download_error: はダウンロードできません
extension_whitelist_error: "%{extension}ファイルのアップロードは許可されていません。アップロードできるファイルタイプ: %{allowed_types}"
extension_blacklist_error: "%{extension}ファイルのアップロードは許可されていません。アップロードできないファイルタイプ: %{prohibited_types}"
content_type_whitelist_error: "%{content_type}ファイルのアップロードは許可されていません。アップロードできるファイルタイプ: %{allowed_types}"
content_type_blacklist_error: "%{content_type}ファイルのアップロードは許可されていません"
rmagick_processing_error: "rmagickがファイルを処理できませんでした。画像を確認してください。エラーメッセージ: %{e}"
mini_magick_processing_error: "MiniMagickがファイルを処理できませんでした。画像を確認してください。エラーメッセージ: %{e}"
min_size_error: "を%{min_size}以上のサイズにしてください"
max_size_error: "を%{max_size}以下のサイズにしてください"
##参考記事
【Rails】CarrierwaveとMiniMagickを使って画像を投稿する方法
Rails で画像のアップロード機能を実装する
CarrierWaveでデフォルト画像の設定
CarrierWaveを使って、ユーザー画像を設定する。
CarrierWave 拡張子とサイズ制限
[Rails6.0.2]CarrierWaveを基本に忠実に使ってみる
carrierwaveを用いて画像投稿機能を作成