STUDY MEMO

学習のメモ書き

<Ruby on Rails エラー編> production環境でのrails sでActionController::RoutingErrorのエラーが発生

$ bundle exec rails s -e production

プロダクション環境でサーバーを立ち上げたところ、scssが反映されていなかった。
原因を調べるためにproduction.logを見たところ、以下のようなログになっていた。

I, [2021-06-08T22:49:53.332919 #8860]  INFO -- : [d81593ef-a63e-4d17-b96a-5aeced17da63] Started GET "/" for 127.0.0.1 at 2021-06-08 22:49:53 +0900
I, [2021-06-08T22:49:53.471239 #8860]  INFO -- : [d81593ef-a63e-4d17-b96a-5aeced17da63] Processing by TopController#index as HTML
I, [2021-06-08T22:49:53.534582 #8860]  INFO -- : [d81593ef-a63e-4d17-b96a-5aeced17da63]   Rendered top/index.html.slim within layouts/application (Duration: 40.9ms | Allocations: 19794)
I, [2021-06-08T22:49:53.603623 #8860]  INFO -- : [d81593ef-a63e-4d17-b96a-5aeced17da63] [Webpacker] Everything's up-to-date. Nothing to do
I, [2021-06-08T22:49:53.781214 #8860]  INFO -- : [d81593ef-a63e-4d17-b96a-5aeced17da63]   Rendered shared/_privacy_policy.html.slim (Duration: 174.0ms | Allocations: 21561)
I, [2021-06-08T22:49:53.803296 #8860]  INFO -- : [d81593ef-a63e-4d17-b96a-5aeced17da63]   Rendered shared/_terms_of_use.html.slim (Duration: 20.5ms | Allocations: 23845)
I, [2021-06-08T22:49:53.803536 #8860]  INFO -- : [d81593ef-a63e-4d17-b96a-5aeced17da63]   Rendered layout layouts/application.html.slim (Duration: 310.0ms | Allocations: 76746)
I, [2021-06-08T22:49:53.804010 #8860]  INFO -- : [d81593ef-a63e-4d17-b96a-5aeced17da63] Completed 200 OK in 333ms (Views: 318.3ms | Allocations: 78813)
I, [2021-06-08T22:49:53.917030 #8860]  INFO -- : [92858f66-6b92-4867-9074-0e4ce8ab7a25] Started GET "/packs/js/application-731e33cfa57f5ac52f87.js" for 127.0.0.1 at 2021-06-08 22:49:53 +0900
F, [2021-06-08T22:49:53.917811 #8860] FATAL -- : [92858f66-6b92-4867-9074-0e4ce8ab7a25]   
[92858f66-6b92-4867-9074-0e4ce8ab7a25] ActionController::RoutingError (No route matches [GET] "/packs/js/application-731e33cfa57f5ac52f87.js"):
[92858f66-6b92-4867-9074-0e4ce8ab7a25]   

/packs/js/~がActionController::RoutingErrorを起こしている。

対処法

public以下のpacksが読み込めていない。
config/environments/production.rbのconfig.public_file_server.enabledをtrueにすることで読み込むことができるようになる。

config.public_file_server.enabled:
public/ディレクトリ内の静的アセットを扱うかどうかを指定します。
デフォルトではtrueが設定されますが、production環境ではアプリケーションを実行するNginxやApacheなどのサーバーが静的アセットを扱う必要があるので、falseになります。
デフォルトの設定とは異なり、WEBrickをでアプリケーションをproductionモードで実行したり(WEBrickをproductionで使うことは推奨されません)テストしたりする場合はtrueに設定します。
そうしないとページキャッシュが利用できなくなり、public/ディレクトリ以下に常駐する静的ファイルへのリクエストも有効になりません。
Rails アプリケーションを設定する - Railsガイド