概要
開発者以外(=サーバへのデプロイ権限がない)が、Railsアプリからファイルをアップロードできるようにしたい。
すでにrail_adminはセットアップ済みなので、ここからファイル操作ができるようにいじってみる。
今回、アップロードプラグインは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のページに遷移する
その後はマニュアル通りに設定すればOK
※ 通常は、以下のとおりにconfigディレクトリ配下にcloudinary.ymlを作成する
# 例(実際の値はCloudinaryから確認する必要がある)
production:
cloud_name: "sample"
api_key: "874837483274837"
api_secret: "a676b67565c6767a6767d6767f676fe1"
・・・が、今回はherokuへのデプロイなので以下の環境変数の設定だけでOK。
# 例(実際の値は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からファイルアップロードができる
Cloudinaryのサイトを確認すると、先ほどアップロードしたファイルを確認できるはずヽ(`▽´)/
参考資料
Home · sferik/rails_admin Wiki
Cloudinary + Carrierwave + Heroku + Railsでの画像を手軽に利用する方法 - Qiita
carrierwave + rails 4.1 画像アップローダー - 酒と泪とRubyとRailsと