【Rails】Viewファイルの変更がページのリロードで反映されないときの対処法|Dockerのコンテナを再起動は不要(ビューファイル .html.erb)

rails-prograshi(プロぐらし)-kv Rails
記事内に広告が含まれていることがあります。

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::EventedFileUpdateCheckerActiveSupport::FileUpdateCheckerの2つです。

Eventedが付くかつかないかの違いで、どちらもActiveSupportの中で定義されています。

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_changetrueにしておく必要があります。

config.reload_classes_only_on_changeとは?

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ディレクトリ構造

tips

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


参考リンク

タイトルとURLをコピーしました