Docker上に構築したRailsのアプリケーションでViewファイルを更新したときに、開発環境(development)だったとしても、デフォルトの状態ではページをリロードしても変更内容が反映されません。
コンテナを再起動すれば変更内容が反映されますが、ビューファイルを更新するたびに毎回再起動するのは手間で、まったく実用的ではありません。
この対処法について解説しています。
対処法
対処法は、development.rbファイルを1行変更するのみです。
config.file_watcher
の値を、FileUpdateChecker
にします。
ファイルは、config\environments\development.rbにあります。
# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
↓ 修正
# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
config.file_watcher = ActiveSupport::FileUpdateChecker
以上で完成です。
あとは、コンテナを再起動し変更内容を反映させます。※ページをリロードして変更内容を反映させるには数秒かかります。
config.file_watcherとは何か?
config.file_watcher
とは、Railsアプリケーションの設定の一つで、ファイルの変更を検知するための設定です。
値に選択できるのは、ActiveSupport::EventedFileUpdateChecker
とActiveSupport::FileUpdateChecker
の2つです。
Eventedが付くかつかないかの違いで、どちらもActiveSupportの中で定義されています。
ActiveSupport::EventedFileUpdateCheckerとActiveSupport::FileUpdateCheckerの違い
指定 | 内容 | Docker |
---|---|---|
EventedFileUpdateChecker | ファイル内の変更イベントを検出する(デフォルト) | × |
FileUpdateChecker | ファイル全体を監視して変更を検出する | 〇 |
Dockerを使った開発の場合、ローカル(自分のPC)でファイルを変更すると、変更後のファイルがDocker内のボリュームに同期されます。
このとき、Docker内ではファイルを変更して保存という処理が行われていないため、ファイル変更のイベントが発生せず、デフォルトのEventedFileUpdateChecke
は作動しません。
そのため、ファイル全体を監視するFileUpdateChecker
を使います。
なお、ファイル検出(config.file_watcher)を使うためには、config.reload_classes_only_on_change
をtrue
にしておく必要があります。
development.rbとは?
今回設定を記述した、development.rbとは、Railsの開発環境用の設定を行うファイルです。
Rails s
で開発環境(developmentモード)として起動したときに、全体の共通設定となる、application.rbが読み込み、次にdevelopment.rbを読み込みます。
開発環境(productionモード)で起動した場合は、application.rbの後に、production.rbを読み込みます。
▼ファイルパス
config\application.rb
config\environments\production.rb
config\environments\development.rb
▼configディレクトリ構造