質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

解決済

1回答

475閲覧

【Rails】Amazon S3を使ってHerokuで画像を投稿できるようにしたい

hideo3

総合スコア15

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

0グッド

1クリップ

投稿2018/11/10 07:39

問題の内容

開発環境(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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

下記2つのファイルを修正して、解決できました。

# items.controller.rb class ItemsController < ApplicationController : def create @item = Item.new( name: params[:name], price: params[:price], content: params[:content], image: params[:image], # この辺りを修正 user_id: @current_user.id ) if @item.save flash[:notice] = "Exhibited" redirect_to("/items/index") else render("items/new") end end : end
# index.html.erb <div class="main items-index"> <div class="container"> <table> <tbody> <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> <% @items.each do |item| %> <div class="items-index-item"> <tr> <td> <% if item.purchase != nil %> <% if item.id == item.purchase.item_id %> <font color="red">Sold out</font> <% else %> On sale <% end %> <% else %> On sale <% end %> </td> <td> <% if item.image.attached? %> <!-- この辺りを修正 --> <%= image_tag item.image %> <% else %> <img src="<%= "/item_images/#{item.image_name}" %>"> <% end %> </td> <td><%= link_to(item.name, "/items/#{item.id}", style: "color:blue;") %></td> <td><%= item.price %></td> <td><%= item.user.city %></td> <td><%= item.content %></td> </tr> </div> <% end %> </tbody> </table> </div> </div>

投稿2018/11/10 14:10

hideo3

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問