Railsイニシャライザ

イニシャライザはRailsプロセスの起動時に実行されます。つまり、デプロイのたびにイニシャライザも実行されます。

デフォルトでは、Railsはconfig/initializers のイニシャライザがロードされた後にZeitwerkをロードします。Zeitwerkがロードされる前の自動ロードは現在では非推奨ですが、イニシャライザで自動ロードされた定数を多く使用しているため、Zeitwerkのロードをこれらのイニシャライザよりも早くする必要がありました。

この副作用として、イニシャライザではconfig.autoload_paths がすでにフリーズしています。

Zeitwerkがロードされる前にイニシャライザを実行するには、config/initializers_before_autoloader 。このフォルダ内のRubyファイルは、デフォルトのRailsイニシャライザと同じようにアルファベット順にロードされます。

これを実行する必要がある例をいくつか示します:

  1. Railsのconfig.autoload_paths
  2. Zeitwerkが使用する設定(抑揚など)の変更

イニシャライザでのデータベース接続

Railsのイニシャライザからデータベース接続を開かないのが理想的です。イニシャライザからデータベース接続を開く (たとえば、データベースが存在するかチェックしたり、データベースクエリを実行したりする) ということは、db:dropdb:test:prepare のようなタスクが失敗することを意味します。

これを防ぐために、ルートのロード中にデータベース接続がオープンされないようにします。To-Doはエラーになります:

RuntimeError:
  Database connection should not be called during initializers.
# ./config/initializers/00_connection_logger.rb:15:in `new_client'
# ./lib/gitlab/database/load_balancing/load_balancer.rb:112:in `block in read_write'
# ./lib/gitlab/database/load_balancing/load_balancer.rb:184:in `retry_with_backoff'
# ./lib/gitlab/database/load_balancing/load_balancer.rb:111:in `read_write'
# ./lib/gitlab/database/load_balancing/connection_proxy.rb:119:in `write_using_load_balancer'
# ./lib/gitlab/database/load_balancing/connection_proxy.rb:89:in `method_missing'
# ./config/routes.rb:10:in `block in <main>'
# ./config/routes.rb:9:in `<main>'