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

##手順
①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の記入
画像ファイルの表記法には２つあり、違いはリサイズの大きさか、オリジナルサイズかで変わってくる。

```
#アップローダーファイル

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が出力するエラーの日本語化``
※[参考](https://github.com/carrierwaveuploader/carrierwave-i18n/blob/master/rails/locales/ja.yml)

```
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を使って画像を投稿する方法](https://techtechmedia.com/carrierwave-minimagick-image/)
[Rails で画像のアップロード機能を実装する](https://numb86-tech.hatenablog.com/entry/2018/08/18/114948)
[CarrierWaveでデフォルト画像の設定](https://qiita.com/soehina/items/fa1893fff53fd9baaf60)
[CarrierWaveを使って、ユーザー画像を設定する。](https://qiita.com/nekotanku/items/5da43600f35eada64eac)
[CarrierWave 拡張子とサイズ制限](https://qiita.com/mamika311/items/3fb05d68fb2010928e34)
[[Rails6.0.2]CarrierWaveを基本に忠実に使ってみる](https://yuruli.info/using-carrierwave-on-rails-6/#toc13)
[carrierwaveを用いて画像投稿機能を作成](https://qiita.com/kidokoro-syusei/items/4f966c48b6f1cba4c57d)