問題の内容
開発環境(Cloud9)で画像を投稿(保持)できるようにしていましたが、プロダクション環境(Heroku)では画像を保持できていませんでした。
下記を参考に、Amazon S3を使ってHerokuで画像を投稿(保持)できるように設定したかったのですが、設定前と変わらず、1日経つと画像が消えてしまいます(S3 にも画像を保存できていません)。
【Rails】Amazon S3を使ってHerokuで画像を投稿できるようにする方法
https://qiita.com/hmmrjn/items/479c9e9ce82771f1b6d7
作業内容
①Active Storageをインストール
bash
1$ rails -v 2Rails 5.2.1 3 4$ rails active_storage:install 5$ rails db:migrate
②Amazon S3でバケット及びアクセスキーを作成
③Railsで以下実施
bash
1# Gemfileを編集 2gem "aws-sdk-s3", require: false # 追記 3 4$ bundle install 5 6# S3へのアクセスキーを入力 7$ EDITOR=vim rails credentials:edit 8aws: 9 access_key_id: XXXXXXXX #ここに自分のアクセスキーIDをコピペ 10 secret_access_key: XXXXXXXX #ここに自分のシークレットアクセスキーをコピペ 11 12# config/storage.ymlを以下のように編集(Herokuでの画像の保存先をAmazon S3に変更) 13amazon: 14 # 以下3行はそのまま 15 service: S3 16 access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> 17 secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> 18 # 以下2行を変更 19 region: ap-northeast-1 #東京 20 bucket: XXXXXXXX #自分で作成したS3のバケットの名前 21 22# config/environment/production.rbを以下のように編集 23config.active_storage.service = :amazon # amazonに変更 24 25# 画像を扱っているモデルに以下追記 26class Item < ApplicationRecord 27 has_one_attached :image # 追記 28 : 29end
④Herokuで以下実施
bash
1$ heroku buildpacks:add -i 1 https://github.com/heroku/heroku-buildpack-activestorage-preview 2$ git add . 3$ git commit -m "added s3 to production" 4$ git push heroku master 5$ heroku config:set RAILS_MASTER_KEY=マスターキーをここに貼り付け 6$ heroku run rails db:migrate 7$ heroku open
上記を実施しましたが、設定前と変わらず、1日経つと画像が消えてしまいます(S3 にも画像を保存できていません(バケットの中身は空))。
herokuだとトラブルシューティングが難しいので、プロダクション環境のストレージもAmazon S3に変更しています。
bash
1# config/environment/production.rbを以下のように編集 2config.active_storage.service = :amazon # amazonに変更
わからないこと
Railsの下記ファイルも修正が必要なのでしょうか。どなたかわかる方いましたら、よろしくお願い致します。
rails
1<%# new.html.erb %> 2<div class="main items-new"> 3 <div class="container"> 4 <h1 class="form-heading">Exhibit</h1> 5 <%= form_tag("/items/create", {multipart: true}) do %> 6 <div class="form"> 7 <div class="form-body"> 8 <% @item.errors.full_messages.each do |message| %> 9 <div class="form-error"> 10 <%= message %> 11 </div> 12 <% end %> 13 14 <p>Image</p> 15 <input name="image" type="file"> 16 <p>Item name</p> 17 <input name="name" value="<%= @item.name %>"> 18 <p>Price(Pura)</p> 19 <input name="price" value="<%= @item.price %>"> 20 <p>Description</p> 21 <textarea name="content"><%= @item.content %></textarea> 22 <input type="submit" value="exhibit"> 23 </div> 24 </div> 25 <% end %> 26 </div> 27</div>
ruby
1# items.controller.rb 2class ItemsController < ApplicationController 3 : 4 def create 5 @item = Item.new( 6 name: params[:name], 7 price: params[:price], 8 content: params[:content], 9 user_id: @current_user.id 10 ) 11 12 if @item.save 13 if params[:image] 14 @item.image_name = "#{@item.id}.jpg" 15 image = params[:image] 16 File.binwrite("public/item_images/#{@item.image_name}", image.read) 17 end 18 @item.save 19 flash[:notice] = "Exhibited" 20 redirect_to("/items/index") 21 else 22 render("items/new") 23 end 24 end 25 : 26end
rails
1<%# index.html.erb %> 2<div class="main items-index"> 3 <div class="container"> 4 <table> 5 <tbody> 6 <tr><th>On sale/Sold out</th><th>Image</th><th>Item name</th><th>Price(Pura)</th><th>City</th><th>Description</th></tr> 7 <% @items.each do |item| %> 8 <div class="items-index-item"> 9 <tr> 10 <td> 11 <% if item.purchase != nil %> 12 <% if item.id == item.purchase.item_id %> 13 <font color="red">Sold out</font> 14 <% else %> 15 On sale 16 <% end %> 17 <% else %> 18 On sale 19 <% end %> 20 </td> 21 <td><img src="<%= "/item_images/#{item.image_name}" %>"></td> 22 <td><%= link_to(item.name, "/items/#{item.id}", style: "color:blue;") %></td> 23 <td><%= item.price %></td> 24 <td><%= item.user.city %></td> 25 <td><%= item.content %></td> 26 </tr> 27 </div> 28 <% end %> 29 </tbody> 30 </table> 31 </div> 32</div>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。