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

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

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

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

1702閲覧

本番環境で時間をおいてアクセスすると画像が表示されなくなる件について

Engineer_traine

総合スコア17

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/10/08 04:17

前提・実現したいこと

ポートフォリオでカフェを登録できるようなもの作成をしている最中なのですがタイトルにもある通り
画像が表示されなくなることについて解決できず困っています。
具体的に経緯としては画像を登録した直後や少しの間は表示されるのですが時間が経過して再度
アクセスすると画像が表示されなくなってしまいます。
background imageやトップページにある画像等は表示されますがcrud処理の方でcreateで
画像を登録する方が表示されなくなります。
nameやaddressカラムは表示されます。
herokuで使用されているdbを確認してみましたがデータは登録されていました。
なにか原因のわかる方いましたらどうかお力を貸していただきたいです。
イメージ説明

該当のソースコード

<%= render "shared/error_messages", obj: @cafe %> <%= form_with(model: cafe) do |form| %> <div class="cafe_form"> <div class="field"> <%= form.label :イメージ画像 %> <%= form.file_field :image %> </div> <div class="field"> <%= form.label :店名 %> <%= form.text_field :name %> </div> <div class="field"> <%= form.label :住所 %> <%= form.text_field :address %> </div> <div class="field"> <%= form.label :営業時間 %> <%= form.time_select :business_hours %> <%= form.time_select :end_business_hours %> </div> <div class="field"> <%= form.label :コンセント席数 %> <%= form.number_field :number_seats %> </div> <div class="field"> <%= form.label :wifi %> <%= form.check_box :wifi %> </div> <div class="actions"> <%= form.submit %> </div> <div class="back_link"> <%= link_to '戻る', caves_path %> </div> </div> <% end %>
<% provide(:title, "cafe") %> <%= render "shared/login_header" %> <div class="main"> <div class="search_cafe"> <%= search_form_for @q do |f| %> <div class="search_cafe_field"> <%= f.search_field :name_or_address_cont, :placeholder => "店名" %> </div> <%= f.submit "検索", class: "search_button" %> <% end %> </div> <div class="index_title">カフェ一覧</div> <div class="cafe_container"> <% @caves.each do |cafe| %> <div class="smaller_container"> <div class="cafe_information"> <div class="cafe_card"> <div class="cafe_img"> <% if cafe.image? %> <%= image_tag cafe.image.url %> <% else %> <p>画像なし</p> <% end %> </div> <div class="cafe_name"> <%= link_to cafe_path(cafe.id) do %> <%= cafe.name %> <% end %> </div> </div> </div> </div> <% end %> <%= paginate @caves %> </div> </div>
class ImageUploader < CarrierWave::Uploader::Base # Include RMagick or MiniMagick support: include CarrierWave::RMagick # include CarrierWave::MiniMagick # Choose what kind of storage to use for this uploader: storage :file # storage :fog # Override the directory where uploaded files will be stored. # This is a sensible default for uploaders that are meant to be mounted: def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end # Provide a default URL as a default if there hasn't been a file uploaded: # def default_url(*args) # # For Rails 3.1+ asset pipeline compatibility: # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) # # "/images/fallback/" + [version_name, "default.png"].compact.join('_') # end # Process files as they are uploaded: # process scale: [200, 300] process :resize_to_limit => [700, 700] process :convert => 'jpg' # # def scale(width, height) # # do something # end # Create different versions of your uploaded files: version :thumb do process :resize_to_limit => [300, 300] end # Add an allowlist of extensions which are allowed to be uploaded. # For images you might use something like this: def extension_allowlist %w(jpg jpeg gif png) end # Override the filename of the uploaded files: # Avoid using model.id or version_name here, see uploader/store.rb for details. def filename super.chomp(File.extname(super)) + '.jpg' if original_filename.present? time = Time.now name = time.strftime('%Y%m%d%H%M%S') + '.jpg' name.downcase end end end
class CavesController < ApplicationController before_action :set_cafe, only: [:show, :edit, :update, :destroy] # GET /caves or /caves.json def index @q = Cafe.ransack(params[:q]) @caves = @q.result(distinct: true).page(params[:page]).per(8) end # GET /caves/1 or /caves/1.json def show end # GET /caves/new def new @cafe = Cafe.new end # GET /caves/1/edit def edit end # POST /caves or /caves.json def create @cafe = Cafe.new(cafe_params) @cafe.user_id = current_user.id respond_to do |format| if @cafe.save format.html { redirect_to @cafe, notice: "登録しました" } format.json { render :show, status: :created, location: @cafe } else format.html { render :new, status: :unprocessable_entity } format.json { render json: @cafe.errors, status: :unprocessable_entity } end end end # PATCH/PUT /caves/1 or /caves/1.json def update respond_to do |format| if @cafe.update(cafe_params) format.html { redirect_to @cafe, notice: "更新しました" } format.json { render :show, status: :ok, location: @cafe } else format.html { render :edit, status: :unprocessable_entity } format.json { render json: @cafe.errors, status: :unprocessable_entity } end end end # DELETE /caves/1 or /caves/1.json def destroy @cafe.destroy respond_to do |format| format.html { redirect_to caves_url, notice: "削除しました" } format.json { head :no_content } end end private def set_cafe @cafe = Cafe.find(params[:id]) end def cafe_params params.require(:cafe).permit(:image, :name, :address, :business_hours, :end_business_hours, :number_seats, :wifi, :user_id, :latitude, :longitude) end end

試したこと

heroku pg:psql -c "select * from caves;"
よりherokuで使用されているdbよりtableを確認してみたところデータは登録されています。
また、他のカラムであるnameやaddressは表示されることから画像の登録がうまくできていない
のかとは考えていますが根本的な原因の解明はできていません。

補足情報(FW/ツールのバージョンなど)

使用している環境やgemについてですが下記の通りです。
docker/docker-compose
rails/ruby

gem 'carrierwave'
gem 'rmagick'

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

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

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

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

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

guest

回答2

0

自己解決

aws s3に保存先を変更することで解決しました。

投稿2021/10/13 08:10

Engineer_traine

総合スコア17

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

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

0

Herokuのディスクは揮発性で、一定の時間が経過すると再起動で反映したコード以外のファイルが消滅します。

アップロードファイルは、S3などHeroku外で永続可能な場所に置く必要があります。

投稿2021/10/08 05:09

maisumakun

総合スコア145121

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

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

Engineer_traine

2021/10/08 08:26 編集

ご回答ありがとうございます。 そのようでしたので一応対応の方行ったのですがやはり変わりません。 行ったこととしてはdockerでaws keyとsecret key設定し heroku環境に環境変数として設定、改善する必要のあるファイルを変更しました。 登録した画像のデータがバケットにあるか確認しましたが存在しませんでした。 なにか考えられる原因はありますでしょうか?
maisumakun

2021/10/08 09:02

> 改善する必要のあるファイルを変更しました。 何をどのように変更したのですか?
Engineer_traine

2021/10/08 11:37 編集

gemfileにて下記追加。 gem "aws-sdk-s3", require: false gem 'aws-eventstream', '~> 1.1.1' model/cafe.rbに下記追加。 has_one_attached :image enviroment/production.rbにて下記追加。 config.active_storage.service = :amazon storage.ymlにてamazonの箇所コメントアウト解除。 amazon: service: S3 access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> region: ap-northeast-1 bucket: searching-outlet 上記を一通り行いました。
maisumakun

2021/10/08 11:51

ImageUploaderの「storage :file」はそのままなのですか?
Engineer_traine

2021/10/08 11:55

そのままの状態になっております。 変更する必要がありますでしょうか?
maisumakun

2021/10/08 12:00

> 変更する必要がありますでしょうか? それが「ファイルに保存する」という指定なのではないでしょうか?
Engineer_traine

2021/10/08 12:13

development,test用はstorage :fileでローカルファイルに画像の保存。 production用はstorage :fogでs3への保存とわけて記述するという認識でしょうか?
maisumakun

2021/10/08 12:28

そうしたければ、そのように書くのが妥当かと思います。
Engineer_traine

2021/10/08 13:12

幾度も申し訳ありません。 一応上記のように対応の方したのですが、フォームに画像ファイルや名前等を登録し 最後に登録するのボタンを押した際に画面遷移されず We're sorry, but something went wrong. と表示されてしまいます。 ローカルでactive storageのマイグレートを行ったことが原因かと思い heroku runでの実行を行ったところやはりされていなかったようでマイグレートされたのですが 解決はされませんでした。 なにか見直すべき箇所などはありますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問