概要

Railsでアップロードされた画像を保存するというときに便利なCarrierWaveというgemを紹介します。

これを使うと、簡単に画像のアップロードを実現することができます。

環境

  • Rails 5.1
  • CarrerWave 1.2.2

インストール

最初に、CarrierWaveのインストールをします。

インストールのために、Gemfileに次のように追記します。

gem 'carrierwave'

追記したら、bundle installでインストールしましょう。

カラムの用意

CarrierWaveでは、保存した画像のパスをデータベースに保存します。

なので、データベースに保存するのは文字列です。

今回は、Commentというモデルがあり、そこに保存した画像のパスを保存するimage_pathという名前のカラムがあるとします。

Uploaderの追加

CarrierWaveで画像を保存するには、CarrierWaveのUploaderというものを作成する必要があります。

Uploaderはクラスとして表現され、次のコマンドで作成することができます。

ImageUploaderという名前のUploaderを作成するにはこのようにします。

rails generate uploader Image

作成したUploaderはapp/uploaders/の中にあります。

作成されたUploaderのクラスには、画像の保存時に色々と処理をするための設定がコメントアウトされて書かれています。

今回は、詳しい設定については見ていきません。

ちなみに、コメントアウトされていないところに画像の保存場所が書かれていますが、これはpublicディレクトリの配下に保存されます。

連携

Uploaderを作っただけでは使うことができません。

使うためには、モデルとUploaderを連携させる必要があります。

次の記述をモデルに書くことで連携できます。

今回の場合は、Commentモデルの中に書きます。

mount_uploader :image_path, ImageUploader

連携には、mount_uploaderというものを使います。

第一引数には、保存した画像のパスを保存するためのカラム名、第二引数にはUploaderのクラスを指定します。

Viewの記述

さいごに、画像をアップロードできるようにHTMLを変える必要があります。

form_for/form_withでは、次のようにして画像のアップロードのためのHTMLを生成します。

<%= form.file_field :image_path %>

後は、普段通りに入力、送信をすれば画像の保存ができます。

まとめ

分かってしまうと簡単にできます。

CarrierWaveでは、画像の保存時に色々と処理をするための機能があるのですが、それらについては説明しませんでした。

気が向いたら、それらの設定についても書きたいと思います。