【Rails】本番環境との画像参照の切り替え方について


この記事について

デプロイを済ませたアプリを、ローカル環境で画像投稿するとなぜか全てNoImageになってしまう!

それの原因がわかったので記事にします。

おそらく、僕と同じで某プログラミングスクールを卒業した人は高確率でこの問題にぶつかっているんじゃないかな?と思っています。
なぜなら、カリキュラムに書いてある内容には、この問題について触れていないから(笑

こんな感じ

全部NoImageになっちゃってるじゃん!!(汗

解決方法

/config/initializers/carrierwave.rbの記述で、本番とローカルで参照を分岐させる処理がなかったので追加して解決しました。

カリキュラムにはcarrierwave.rbというファイルを作成して、修正前のソースコードを記述しましょう。としか書かれていなかったんですね。
なので、ここでこのファイルが何をしているのか。をしっかり理解できていないと、コピペして満足してしまいます(笑

修正前carrierwave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
    config.storage = :fog
    config.fog_provider = 'fog/aws'
    config.fog_credentials = {
      provider: 'AWS',
      aws_access_key_id: Rails.application.secrets.aws_access_key_id,
      aws_secret_access_key: Rails.application.secrets.aws_secret_access_key,
      region: 'ap-northeast-1'
    }
    config.fog_directory  = 'ここはアプリごとに異なる'
    config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/ここはアプリごとに異なる'
end

なので、if Rails.env.production?で本番かローカルかで参照する箇所を分岐させます。
本番だったらAWS、ローカルだったらstorageを:fileに。といった感じですね。

修正後carrierwave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
  if Rails.env.production?
    config.storage = :fog
    config.fog_provider = 'fog/aws'
    config.fog_credentials = {
      provider: 'AWS',
      aws_access_key_id: Rails.application.secrets.aws_access_key_id,
      aws_secret_access_key: Rails.application.secrets.aws_secret_access_key,
      region: 'ap-northeast-1'
    }
    config.fog_directory  = 'ここはアプリごとに異なる'
    config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/ここはアプリごとに異なる'
  else
    config.storage :file
    config.enable_processing = false if Rails.env.test?
  end
end

これを記述して、再度rails sをし直しましょう!
じゃないと修正内容が反映されないのでお気をつけて!

はい。反映されました!

さいごに

理解している人からすれば「そりゃそうだ」っていう話ですが、やっぱり初学者はこういう当たり前の問題にぶつかりがちな気がします。
ですので、もし同じような事に悩まされている方がいて、この記事がお手伝いなったら嬉しいなぁ。と思っています。

それでは、ありがとうございました!