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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

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

Heroku

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

2635閲覧

Heroku上で、一定時間経つと消える画像と消えない画像がある。

punchan36

総合スコア105

Ruby on Rails 5

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

Heroku

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/10/19 10:33

前提・実現したいこと

Railsアプリを Heroku にデプロイし、heroku run rails db:migrate まで済ませました。
ローカル環境と変わらずステージング環境でも上手くビューが表示されているのですが、画像表示に関連していくつか疑問点が出てきました。
Qiita を参考に、一定時間が経つと Heroku でアップロードした画像が消える点も学びました。私のアプリでも同様に一定時間が経つと画像が表示されなくなる状態です。

[質問1]
前述の通り、ユーザーが更新した画像は一定時間が経つと表示されなくなるのに対し、デフォルトに設定している画像は消えずに表示されたままです。
画像は全て同じ public 配下に保存しているにも関わらず、このように結果がずれる理由が分かりません。
Qiita には「一定時間が経つと、Heroku上のリポジトリ (Dyno) が最後のコミットの状態にリセットされる」とありますが、リセットされるたび、git push されたコードが毎回読み込まれる為、そこに記述のあるデフォルトの画像は消えずに毎回読み込まれると言う事なのでしょうか。

以下がユーザーを新規登録する際のコードです。

users_controller.rb

def create @user = User.new( name: params[:name], email: params[:email], image_name: "default_user.jpg", ←デフォルトのプロフィール画像を指定して保存。 cover_image_name: "default_cover_user.jpg", ←デフォルトのカバー画像を指定して保存。 password: params[:password] ) if @user.save session[:user_id] = @user.id flash[:notice] = "Your account has been successfully created" redirect_to("/users/#{@user.id}") else render("users/new") end end

[質問2]
Herokuでアップロードした画像が一定時間経つと消えてしまいます(rails)にあるように、画像は AWS S3 のようなストレージに保存すべきと言うことが分かりました。
またデータベースに画像を保存するのはありでしょうか?にあるように、データ量の大きい画像などのファイルは専用ストレージに保存するのが好ましいとの事ですが、私のアプリでは今の所画像以上に容量を食うカラムは存在しません(テキストのみ)。ですので他は特に画像のようにストレージを別途用意する必要はないでしょうか。(ストレージサービスを利用する前に、認識が合っているかを確認しておきたかった為質問致しました。)

[質問3]
app/assets/images 配下と public 配下の、保存場所の違いに関して。
app/assets/images 配下に保存することでアセットパイプラインの対象になり、表示が早くなる」とありますが(参考ページ)、やはりそちらの保存場所の方が望ましいのでしょうか?
現在 public 配下に画像を保存しておりますが、特にこだわりはなく習慣でそうしております。アプリ全体を修正するのは少し大変そうですが、変更するだけのメリットがあれば修正したいと思います。

[質問4]
以下のコードに関してはどちらも同じ意味で、単純に上のコードをコンパイルしたものが下のコードだと思います。
これまでは習慣で下のコードをアプリ全体で書いておりましたが、これも優劣などはありますでしょうか。このデプロイを機会に、修正出来る所はしておこうと思いました。

<%= image_tag "/user_images/#{user.image_name}" %> <img src="<%= "/user_images/#{user.image_name}" %>">

尚、本番環境での画像表示に関して config/envinronments/production.rb 内の記述は以下のように true に既に変えております。

config.assets.compile = false ↓ config.assets.compile = true

細々とした疑問になってしまったのですが、どなたかご助言頂けますと有難いです。

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

ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

リセットされるたび、git push されたコードが毎回読み込まれる為、そこに記述のあるデフォルトの画像は消えずに毎回読み込まれると言う事なのでしょうか。

そのとおりです。

「app/assets/images 配下に保存することでアセットパイプラインの対象になり、表示が早くなる」とありますが

それはあくまで、それ相応の処理ができるという意味です(特に、画像類は事前に圧縮したものをコードに加えておけばそれで問題ないレベルです)。特に前処理も加えず反映させるだけなら大差はありません。

以下のコードに関してはどちらも同じ意味で、単純に上のコードをコンパイルしたものが下のコードだと思います。

app/assets/内のファイルを参照する場合、ファイル名も変換されますので、image_tagを使わないと正常に参照できません。それ以外の、コントローラー経由とかpublic/以下とかの場合は特に違いはありません…が、タグの一部だけRailsから作るのはXSSという脆弱性のもとになりますので、あまりおすすめはしません。

投稿2021/10/19 10:40

maisumakun

総合スコア146018

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

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

punchan36

2021/10/19 11:17

大変勉強になりました。 画像の保存場所に関しては、明確に改良が必要な時が来るまでは現状通り public 配下に置こうと思います。 また `img src` の部分は `image_tag` を使って書き直そうと思います。 有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問