はじめに
railsでwebアプリを作成中、今回はAWSS3
ではなくCloudinary
を使うことになりました。使ってみた結果、自分的にはCloudinary
の方が使いやすかったので今度使うときのために、備忘録。
またAWSS3
の方もまとめてあるのでよかったらどうぞ。=>https://qiita.com/yukiyukimiyaiwa/items/a9e0103c8342b81f6ac1
前提条件
rails 5.2.1
ruby 2.5.1
Herokuにデプロイできる状態とします
今回はUser
にimage
カラムが追加されているとします
早速やってみる
追加・変更記述
gem 'cloudinary'
gem 'carrierwave'
gem 'fog'
この三つを記述しbundle install
します。(てっきりfogはAWSS3にアップするためのものかと思ってたけど、cloudinaryでも必要みたい)
uploader
を作るので
$ rails g uploader Image
するとapp/uploaders
が作成されて、今回ならそこにimage_uploader.rb
があるはずです。これの記述を変更します
class PostUploader < CarrierWave::Uploader::Base
include Cloudinary::CarrierWave
.
.
# storage :file
.
.
end
上記のようにinclude Cloudinary::CarrierWave
を追加します。また初期設定ではstorage :file
が有効化されているので、コメントアウトしてください。
次はuser.rb
を変更
class User < ApplicationRecord
mount_uploader :image, UserUploader
.
.
end
以上のように追加します。
Herokuの設定
$ heroku addons:add cloudinary:starter
これでCloudinaryが使えるようになります。
次はHerokuからCloudinaryを開きます。
すると
というところがあると思います。(近くにAPIkeyとか書いてあるのでスクショはこれが限界。。。)
YML
をクリックしてアカウントの詳細をダウンロードします。
ダウンロードしたcloudinary.yml
をconfig
の下に置きます。
またこのファイルを次のように変更します。(もともと書いてあったcloud_name,api_key,api_secretは環境変数にするのでメモを取っておく。)
---
development:
cloud_name: <%= ENV['CLOUDINARY_CLOUD_NAME'] %>
api_key: <%= ENV["CLOUDINARY_API_KEY"] %>
api_secret: <%= ENV["CLOUDINARY_API_SECRET"] %>
enhance_image_tag: true
static_image_support: false
production:
cloud_name: <%= ENV['CLOUDINARY_CLOUD_NAME'] %>
api_key: <%= ENV["CLOUDINARY_API_KEY"] %>
api_secret: <%= ENV["CLOUDINARY_API_SECRET"] %>
enhance_image_tag: true
static_image_support: true
test:
cloud_name: <%= ENV['CLOUDINARY_CLOUD_NAME'] %>
api_key: <%= ENV["CLOUDINARY_API_KEY"] %>
api_secret: <%= ENV["CLOUDINARY_API_SECRET"] %>
enhance_image_tag: true
static_image_support: false
環境変数にする理由はAWSS3の時も書きましたが、悪用される危険があるからです。絶対に直接ソースコードに書き込むのはやめましょう。
環境変数の設定は以下のようにしましょう。(もちろん他の方法で環境変数を設定してもOK)
$ heroku config:set CLOUDINARY_CLOUD_NAME="メモしたcloud_name"
$ heroku config:set CLOUDINARY_API_KEY="メモしたapi_key"
$ heroku config:set CLOUDINARY_API_SECRET="メモしたapi_secret"
あとはローカル環境で試しましょう。
$ CLOUDINARY_CLOUD_NAME="メモしたcloud_name" CLOUDINARY_API_KEY="メモしたapi_key" CLOUDINARY_API_SECRET="メモしたapi_secret" rails s
これで確認したらおk
ちなみに出力は
<%= @user.image.to_s %>
で。
.to_s
はimageカラムの時だけ(なぜかわからんけど。他のカラム名だったらいらない)
終わり
説明は難しかったけどこっちの方が相性良い気がする。今度からこれ使おう!!!!と思って忘れないうちに殴り書きしました。間違いなどがあったらご指摘お願いします。