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
