rails_adminからファイルをアップロードできるようにする

# 概要
開発者以外（＝サーバへのデプロイ権限がない）が、Railsアプリからファイルをアップロードできるようにしたい。
すでに[rail_adminはセットアップ済み](http://qiita.com/yukofeb/items/f445846c91e186669c8f)なので、ここからファイル操作ができるようにいじってみる。

今回、アップロードプラグインはcarrierwaveを使う。
また、Heroku環境だと再起動のタイミングで保存したファイルが消えてしまうらしいので、Herokuには保存せず外部ストレージ（Cloudinary）を利用する。

# 環境
```
$ ruby -v; rails -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]
Rails 4.2.1
```

# パッケージインストール
Gemfile追記

```
$ vim Gemfile
gem 'carrierwave'
gem 'cloudinary'
```

インストール

```
$ bundle install
```

# アップローダー設定
作成

```
$ rails g uploader Cafemenu
      create  app/uploaders/cafemenu_uploader.rb
```

各種設定

```
$ vim app/uploaders/cafemenu_uploader.rb
# cloudinary（後で設定）をインクルード
include Cloudinary::CarrierWave

# いらない設定はコメントアウト
  # storage :file
  # storage :fog
  # def store_dir
  #   "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  # end

# アップロードファイルをpdfに限定
  def extension_white_list
    %w(pdf)
  end
```

# モデル設定
作成

```
$ rails g model cafemenu name:string file:string
      invoke  active_record
      create    db/migrate/20150911162123_create_cafemenus.rb
      create    app/models/cafemenu.rb
      invoke    rspec
      create      spec/models/cafemenu_spec.rb
```

アップローダーにマウント＆ついでにバリデーション設定

```
$ vim app/models/cafemenu.rb
class Cafemenu < ActiveRecord::Base
  mount_uploader :file, CafemenuUploader
  
  validates :name, :presense => true
  validates :file, :presense => true
end
```

マイグレーション

```
$ rake db:migrate
```

# Cloudinary対応
インストール（herokuダッシュボードからでも追加できる）
ひとまず無料プランで。

```
$ heroku addons:add cloudinary:starter
```

herokuダッシュボードのアドオンのリンクから、Cloudinaryのページに遷移する

アプリケーションの種類（今回はRails）を選択
![cloudinary01](https://gist.github.com/yukofeb/07dd51932957dbb657b8/raw/381535b2276fb4938bf0967b3e3632c5f8e506c9/cloudinary01.png)

その後は[マニュアル通り](http://cloudinary.com/documentation/rails_integration#getting_started_guide)に設定すればOK

※ 通常は、以下のとおりにconfigディレクトリ配下にcloudinary.ymlを作成する

```
# 例（実際の値はCloudinaryから確認する必要がある）
production:
  cloud_name: "sample"
  api_key: "874837483274837"
  api_secret: "a676b67565c6767a6767d6767f676fe1"
```

・・・が、[今回はherokuへのデプロイなので以下の環境変数の設定だけでOK](http://cloudinary.com/documentation/rails_additional_topics#configuration_options)。

```
# 例（実際の値はCloudinaryから確認する必要がある）
CLOUDINARY_URL=cloudinary://874837483274837:a676b67565c6767a6767d6767f676fe1@sample
```

# rails_admin設定

rails_adminからCafememuモデルの変数を操作できるよう、設定を追加する

```
$ vim config/initializers/rails_admin.rb
  config.model 'Cafemenu' do
    edit do
      field :name, :string
      field :file, :carrierwave
    end
  end
```

# 動作確認
ローカルで動作を確認してみる
（ここでは、アップロード確認用にステージング環境のCloudinaryを利用している）
ローカルで確認するときにも、CLOUDINARY_URLの環境変数を設定するのを忘れないように！

```
$ CLOUDINARY_URL=*** rails s
```

うまく設定ができていれば、以下のようにrails_adminからファイルアップロードができる
![cloudinary02](https://gist.github.com/yukofeb/07dd51932957dbb657b8/raw/381535b2276fb4938bf0967b3e3632c5f8e506c9/cloudinary02.png)

成功すれば、リストにも追加される。
![cloudinary03](https://gist.github.com/yukofeb/07dd51932957dbb657b8/raw/381535b2276fb4938bf0967b3e3632c5f8e506c9/cloudinary03.png)

Cloudinaryのサイトを確認すると、先ほどアップロードしたファイルを確認できるはずヽ(｀▽´)/
![cloudinary04](https://gist.github.com/yukofeb/07dd51932957dbb657b8/raw/381535b2276fb4938bf0967b3e3632c5f8e506c9/cloudinary04.png)

# 参考資料
[Home · sferik/rails_admin Wiki](https://github.com/sferik/rails_admin/wiki)
[Cloudinary + Carrierwave + Heroku + Railsでの画像を手軽に利用する方法 - Qiita](http://qiita.com/GenTamura84/items/38cf899827bba050a21c)
[carrierwave + rails 4.1 画像アップローダー - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/carrierwave-image-uploader-rails/)