概要
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では、画像の保存時に色々と処理をするための機能があるのですが、それらについては説明しませんでした。
気が向いたら、それらの設定についても書きたいと思います。