Ruby on Railsのフォームから画像をサーバにアップロードするしくみをRubyGems『CarrierWave』を使って実装します。
またImageMagickを使って画像のリサイズをしたり、フォームのアップロード時に画像サイズのバリデーションにもトライしてみます。
🏀 CarrierWaveの画像アップローダーを作成
ImageMagickのインストール
画像の加工を行うためのライブラリImageMagickをインストールします。
Macの場合は次のコマンドをコマンドラインから実行します。
brew install imagemagick |
Gemfileの登録
Gemfile
に以下を追加して、bundle install
を実行。
# Image Uploader |
CarrierWaveのアップローダーを作成
次のコマンドを実行してCarierWave用のクラスapp/uploaders/image_uploader.rb
を生成します。
# scaffold で Productに関する一式を作成 |
アップローダーの記述を修正
先ほど生成されたimage_uploader.rb
を次のように書き換えます。
# app/uploaders/image_uploader.rb |
Modelのカラムにアップローダーを紐付け
ModelProduct.image
と、アップローダーImageUploader
とをひも付け。
# app/models/product.rb |
view/formへの追加
viewのformに以下を追加。
# app/views/products/_form.html.haml |
view表示側への追記
アップロードした画像をviewで表示させる場合は以下を追記してください。
# app/views/products/show.html.haml |
以下を追加して、テーブルを作成。
bundle exce rake db:migrate |
🎉 補足: 画像のサイズのバリデーション
アップロードする画像のサイズをチェックするバリデーション(validation)です。今回は幅400px, 高さ400pxより小さい場合にバリデーションでエラーが出るようにします。
まずはバリデーションの記述を追記。
# app/models/product.rb |
これで、アップロードした画像が幅400px, 高さ400pxより小さい場合はエラーが出ます。
🎃 補足:simple_formでプレビュー表示させる場合
『simple_form』はformの記述がスッキリするgemです。
このsimple_form
とCarrierWave
を連携させる手順です。
Gemfileの登録
Gemfile
に以下を追加して、bundle install
を実行。
# Form Helper |
プレビュー表示を行うフォーム
次のコードを書きます。
# app/inputs/image_preview_input.rb |
でもって form
側は次のように書きます。
# app/views/products/_form.html.haml |
すると、アップロード済のデータを編集する際に、formでpreview画像が表示されます。
🐡 参考リンク
- How to: Validate attachment file size · carrierwaveuploader/carrierwave Wiki
- How to: Get image dimensions · carrierwaveuploader/carrierwave Wiki
- Adding custom input components · plataformatec/simple_form Wiki
- 【Rails 4】5分で作る画像アップローダー - Sinapps’s blog
- Rails 超お手軽な画像アップローダー CarrierWave の使い方 | Workabroad.jp