[Ruby on Rails 4] CarrierWave を利用して画像をアップロードする form もしくは API を作成する

いろいろ調べたので memo.

[markdown]
リンク先に重複あり。

## 公式

* [carrierwaveuploader/carrierwave: Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworks](https://github.com/carrierwaveuploader/carrierwave)

一通り実装した後に、refile という後継があることを知った。
次の機会があれば使うかも。

* [Rails: carrierwaveの後継、refileでファイルアップロードを実装する](https://suin.io/553)

## Form の作成手順

アップローダーとモデルの紐付け、ビューへの追記など全般。

* [carrierwave + rails 4.2.5 画像アップローダー – 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/carrierwave-image-uploader-rails/)
* [RailsのファイルをアップロードするgemのCarrierWaveのインストール方法 – Rails Webook](http://ruby-rails.hatenadiary.com/entry/20141015/1413300088)

`bin/rails g uploader foo` でアップローダーを作成する。
紐付けたいモデルに `mount_uploader :foo, FooUploader` を追加する。

### 親子関係のフォーム

* [CarrierWaveとSimpleFormを使ってネストした複数ファイルを登録する – Qiita](http://qiita.com/tak74/items/44f4019a059eefc31f65)
* [Carrierwaveで画像を複数アップロードする – Qiita](http://qiita.com/sinagaki58/items/a0d59cc41c6824bb5f67)

次の機会に Simple_form を使うことにする。

* [plataformatec/simple_form: Forms made easy for Rails! It’s tied to a simple DSL, with no opinion on markup.](https://github.com/plataformatec/simple_form)

### ファイル名の変更

* [How to: Create random and unique filenames for all versioned files · carrierwaveuploader/carrierwave Wiki](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Create-random-and-unique-filenames-for-all-versioned-files)
* [Rails CarrierWaveのファイル名を変更する方法 – KeruuWeb](http://keruuweb.com/rails-carrierwave%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)

ユニークなファイル名を付けたい場合に、時間を使うとファイルを見失う。

### 画像のリサイズ

* [RailsのCarrierWaveのカスタマイズ – ファイルの配置先、リサイズ、テストなど – Rails Webook](http://ruby-rails.hatenadiary.com/entry/20141022/1413907332)
* [CarrierWave + RMagick 画像のリサイズをまとめてみました – 麺処 まつば](http://noodles-mtb.hatenablog.com/entry/2013/07/08/151316)

`bin/rails g` で生成されたアップローダーに設定を加えることで対応できる。

### 画像の削除

* [carrierwaveuploader/carrierwave: Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworks](https://github.com/carrierwaveuploader/carrierwave#removing-uploaded-files)

form で `f.file_field :image` としたら、`f.check_box :remove_image` という形式。
コントローラの params にも `:remove_image` を忘れずに追加する。
upload ディレクトリのファイルが削除され、レコードのカラムが null となる。
レコードごと削除したい場合は、`_destroy` を利用する。

### バリデーション

* [How to: Validate attachment file size · carrierwaveuploader/carrierwave Wiki](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Validate-attachment-file-size)
* [carrierwave + rails 4.2.5 画像アップローダー – 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/carrierwave-image-uploader-rails/)

### テスト

* [Rails 超お手軽な画像アップローダー CarrierWave の使い方 | Workabroad.jp](http://www.workabroad.jp/tech/1118)
* [CarrierWaveを利用した画像アップロード機能をRailsに実装しサムネイルとかに使う方法まとめ](https://miningoo.com/782)

思い通りにかけないので [Everyday Rails – RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp) を読む。

## API の作成手順

全般。

* [carrierwaveで画像アップロードAPIサーバー – DesignAssembler](http://hyottokoaloha.hatenablog.com/entry/2016/03/30/234437)
* [[rails]carrierwaveを使った画像投稿APIをRspecでテストしてみる – hello-world.jp.net](https://blog.hello-world.jp.net/ruby/2295/)

API のバージョンやネームスペースの管理をしたい場合、こちらが参考になりそう。

* [#350 REST API Versioning – RailsCasts](http://railscasts.com/episodes/350-rest-api-versioning?language=ja&view=asciicast)
* [RailsでAPIサーバを開発する(AngularJS, Ruby on Rails, SPA) | Developers.IO](http://dev.classmethod.jp/server-side/spa_ruby-on-rails_api_angularjs/)
* [RailsでAPI作成とAPIのテストのまとめ – Rails Webook](http://ruby-rails.hatenadiary.com/entry/20150108/1420675366)

### テスト

API のテスト全般。

* [RailsでAPIサーバを開発する(AngularJS, Ruby on Rails, SPA) | Developers.IO](http://dev.classmethod.jp/server-side/spa_ruby-on-rails_api_angularjs/)
* [RailsでAPI作成とAPIのテストのまとめ – Rails Webook](http://ruby-rails.hatenadiary.com/entry/20150108/1420675366)

## 補遺

パーフェクトRuby on Rails で CarrierWave が紹介されている模様。

パーフェクトRuby on Rails
技術評論社 (2014-10-31)
売り上げランキング: 50,036

[/markdown]