Railsイニシャライザ
イニシャライザはRailsプロセスの起動時に実行されます。つまり、デプロイのたびにイニシャライザも実行されます。
デフォルトでは、Railsはconfig/initializers
のイニシャライザがロードされた後にZeitwerkをロードします。Zeitwerkがロードされる前の自動ロードは現在では非推奨ですが、イニシャライザで自動ロードされた定数を多く使用しているため、Zeitwerkのロードをこれらのイニシャライザよりも早くする必要がありました。
この副作用として、イニシャライザではconfig.autoload_paths
がすでにフリーズしています。
Zeitwerkがロードされる前にイニシャライザを実行するには、config/initializers_before_autoloader
。このフォルダ内のRubyファイルは、デフォルトのRailsイニシャライザと同じようにアルファベット順にロードされます。
これを実行する必要がある例をいくつか示します:
- Railsの
config.autoload_paths
- Zeitwerkが使用する設定(抑揚など)の変更
イニシャライザでのデータベース接続
Railsのイニシャライザからデータベース接続を開かないのが理想的です。イニシャライザからデータベース接続を開く (たとえば、データベースが存在するかチェックしたり、データベースクエリを実行したりする) ということは、db:drop
やdb: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>'