20
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】画像アップロード機能の実装

Last updated at Posted at 2021-12-26

##手順
①gem carrierwavemini_magickをインストール
②uploaders/image_uploader.rbを作成
③uploadersとモデルの紐付けやデフォルト画像の設定、ファイル指定などの細かい設定
④モデルに新たなカラムを追加(例:Postモデルにpost_imageというカラムを新しく追加)
⑤viewの記入
⑥画像アップロードフォーム
⑦画像アップロードに関する日本語化の追加設定

##①gem carrierwavemini_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を用いて画像投稿機能を作成

20
16
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
20
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?