Herokuにデプロイしたアプリでは、アップロードした画像がpushするたびに消えてしまうため、外部のデータベースを用意してそちらに画像を保存する必要があるらしい。
そこでherokuと親和性が良いCloudinaryを使って画像をアップすることにしました。
前提
Railsで練習用アプリを作成しています。アプリというよりホームページに近いかもしれませんが。
100件の本のデータを入れ、indexで一覧表示、showで各本の詳細を表示します。
showで詳細に飛んだ時、その本のカバーを画像で表示させようと思います。
Viewのbooks/newの画面にデータ入力フォームを設け、アプリ上でデータの登録をするとします。
画像アップロードに関しては<%= f.attachment_field :image %>で実装しています。
books/new.html.erb
html
1<%= form_for(@book) do |f| %> 2<table> 3 <tr> 4 <td><%= f.attachment_field :image %></td> 5 </tr> 6 <tr> 7 <td><%= f.text_field :image_title, placeholder: '画像のタイトル' %></td> 8 </tr> 9 <tr> 10 <td><%= f.text_field :title, placeholder: '本のタイトル' %></td> 11 </tr> 12 <tr> 13 <td><%= f.text_field :year, placeholder: '出版年' %></td> 14 </tr> 15 :
このようなフォームで本のタイトルや出版年、カバー画像などを登録し、Viewのbooks/showでその本のデータを表示します。
books/show.html.erb
html
1<table> 2 <tr> 3 <td><%= @book.title %></td> 4 </tr> 5 <tr> 6 <td><%= attachment_image_tag @book, :image, :title => @book.image_title %></td> 7 </tr> 8 :
Bookモデルには以下のように記述し、Booksコントローラのストロングパラメータに:image, :image_titleを入れています。
book.rb
model
1attachment :image
books_controller.rb
controller
1private 2 def book_params 3 params.require(:book).permit(:image, :image_title, ... 4 end 5end
開発環境(ローカル)では、これで問題なく画像が表示されます。
本題
このアプリをherokuにデプロイし、DBが変わったので改めて何件かのデータをbooks/newの画面から入力したところ、初めは何も問題なく表示されたのですが、再度pushしたところ画像のデータだけが消えてしまいました。
そこで、冒頭でも触れましたが、外部のデータベースを用意してそちらに画像を保存することにしました。
以下の手順を踏んで再度フォームから画像を登録したのですが、変化ありません。
画像が結局Cloudinaryに保存されないのですが、あと何をすればいいのでしょうか。
- herokuにCloudinaryのアドオンを追加し
- Cloudinaryの登録を済ませ使えるようにし
- Railsのconfig以下にダウンロードしたcloudinary.ymlを入れ
- 通常のadd ~ pushの手順でpushした
アプリ上で画像を投稿してもCloudinaryに保存されずやはり消えてしまいます。
経験のある方、詳しい方、ぜひご教授願います。
gem 'cloudinary'
を入れる、と書いている人もいたのですが、入れてbundle installしたら、そんなgemは無いとエラーが返ります。
回答1件
あなたの回答
tips
プレビュー