Railsアプリの起動時にクラス属性を設定したい。一部のルートを検査する必要があるため、カスタムコードを実行する前にルートをロードする必要があります。信頼できる場所を見つけるのに苦労しています。
これは、「テスト」環境で完全に機能します。
config.after_initialize do
Rails.logger.info "#{Rails.application.routes.routes.map(&:path)}"
end
ただし、「開発」環境では機能しません(ルートは空です)
今のところ、config.to_prepare
すべてのリクエストの前に発生することを理解しているのと同じコードを実行することで、開発モードで動作しているようです。残念ながら、to_prepare
単独で使用することはテストモードでは機能しないようであるため、重複します。
テストモードではafter_initializeの前にルートがロードされるのに、開発モードではロードされないのはなぜか知りたいです。そして本当に、これのための最良のフックは何ですか?すべての環境で機能する単一のフックはありますか?
*編集*
ルートをリロードするというmuの提案は素晴らしかった。これにより、すべての環境でafter_initialize内のルートに一貫してアクセスできるようになりました。ただし、私のユースケースでは、モデルにクラス属性を設定していて、各リクエストの前にモデルが再ロードされるため、to_prepareからもコードを実行する必要があると思います。
これが私がやったことです。
[:after_initialize, :to_prepare].each do |hook|
config.send(hook) do
User.invalid_usernames += Rails.application.routes.routes.map(&:path).join("\n").scan(/\s\/(\w+)/).flatten.compact.uniq
end
end
それは私には少し厄介なようです。私はむしろ次のようなことをしたいと思います:
config.after_initialize do
User.exclude_routes_from_usernames!
end
config.to_prepare do
User.exclude_routes_from_usernames!
end
しかし、それUser
が調査するのに適切な場所であるかどうかはわかりませんRails.application.routes
。lib /のコードでも同じことができると思いますが、それが正しいかどうかもわかりません。
もう1つのオプションは、to_prepareにmuの提案を適用することです。それは機能しますが、私の開発環境ではすべてのリクエストでルートのリロードに顕著な遅延があるようです。したがって、少なくともDRYですが、これが適切な呼び出しであるかどうかはわかりません。
config.to_prepare do
Rails.application.reload_routes!
User.invalid_usernames += Rails.application.routes.routes.map(&:path).join("\n").scan(/\s\/(\w+)/).flatten.compact.uniq
end