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とは、Railsの拡張機能をまとめたコンポーネントです。言語の拡張や便利なメソッドが入っています。
拡張機能を使用するときは、追加したい機能をrequireします。呼び出しは、必要に応じて対象範囲の絞り込みができます。
#拡張機能をピンポイントで指定(コア拡張機能/オブジェクトグループ/blankメソッド)
require 'active_support/core_ext/object/blank'
#グループで指定(コア拡張機能/オブジェクトグループのメソッド全て)
require 'active_support/core_ext/object'
#コア拡張機能を読み込む
require 'active_support/core_ext'
#すべて読み込む
require 'active_support/all'
※すべて読み込むときに、require 'active_support'
は機能しません。
ActiveSupport::EventedFileUpdateCheckerとActiveSupport::FileUpdateCheckerの違い
指定 | 内容 | Docker |
---|---|---|
EventedFileUpdateChecker | ファイル内の変更イベントを検出する(デフォルト) | × |
FileUpdateChecker | ファイル全体を監視して変更を検出する | 〇 |
Dockerを使った開発の場合、ローカル(自分のPC)でファイルを変更すると、変更後のファイルがDocker内のボリュームに同期されます。
このとき、Docker内ではファイルを変更して保存という処理が行われていないため、ファイル変更のイベントが発生せず、デフォルトのEventedFileUpdateChecke
は作動しません。
そのため、ファイル全体を監視するFileUpdateChecker
を使います。
なお、ファイル検出(config.file_watcher)を使うためには、config.reload_classes_only_on_change
をtrue
にしておく必要があります。
config.reload_classes_only_on_changeはdevelopment.rbに記述する項目の一つで、autoload_pathのファイルを監視して変更を検知します。
デフォルトはtrueです。Rails6にはデフォルトでは記載されていません。(ファイル監視をオフにしたいときにfalueで追記する)
なお、これらのイベント関連のクラスを有効化するには、クラスのキャッシュを保持しないように、config.cache_classes = false
にしておく必要があります。こちらも記載がない場合はfalseになっています。
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ディレクトリ構造

Railsを読み込む前に実行したいコマンドがある場合は、config/application.rbファイルのrequire 'rails/all'
行より前にコードを記述します。