Inicializador de rieles que se ejecuta * después de que se cargan * rutas

Quiero establecer un atributo de clase cuando se inicie mi aplicación Rails. Requiere inspeccionar algunas rutas, por lo que las rutas deben cargarse antes de que se ejecute mi código personalizado. Tengo problemas para encontrar un lugar confiable para conectar.

Esto funciona PERFECTAMENTE en el entorno de "prueba":

config.after_initialize do
  Rails.logger.info "#{Rails.application.routes.routes.map(&:path)}"
end

Pero no trabajar en el entorno de "desarrollo" (las rutas están vacías)

Por ahora, parece que las cosas funcionan en modo de desarrollo ejecutando el mismo código enconfig.to_prepare que entiendo sucede antes de cada solicitud. Desafortunadamente usandoto_prepare solo no parece funcionar en modo de prueba, de ahí la duplicación.

Tengo curiosidad de por qué las rutas se cargan antes de after_initialize en modo de prueba, pero no en modo de desarrollo. Y realmente, ¿cuál es el mejor gancho para esto? ¿Hay un solo gancho que funcione para todos los entornos?

*EDITAR

a sugerencia de @ mu de recargar las rutas fue genial. Me dio acceso constante a las rutas dentro de after_initialize en todos los entornos. Sin embargo, para mi caso de uso, creo que todavía necesito ejecutar el código de to_prepare, ya que estoy configurando un atributo de clase en un modelo y los modelos se vuelven a cargar antes de cada solicitud.

Así que esto es lo que terminé haciendo.

[: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 

Me parece un poco desordenado. Creo que prefiero hacer algo como:

config.after_initialize do
  User.exclude_routes_from_usernames!
end

config.to_prepare do
  User.exclude_routes_from_usernames!
end

Pero no estoy seguro siUser es el lugar correcto para examinarRails.application.routes. Creo que podría hacer lo mismo con el código en lib / pero tampoco estoy seguro de si eso es correcto.

Otra opción es simplemente aplicar la sugerencia de mu en to_prepare. Eso funciona, pero parece que hay un retraso notable al volver a cargar las rutas en cada solicitud en mi entorno de desarrollo, por lo que no estoy seguro de si esta es una buena llamada, aunque es SECO, al menos.

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta