Inicializador de trilhos que executa * depois que as rotas são carregadas?
Eu quero definir um atributo de classe quando meu aplicativo Rails for iniciado. Ele exige a inspeção de algumas rotas, portanto, as rotas precisam ser carregadas antes da execução do meu código personalizado. Estou com problemas para encontrar um local confiável para me conectar.
Isso funciona PERFEITAMENTE no ambiente de "teste":
config.after_initialize do
Rails.logger.info "#{Rails.application.routes.routes.map(&:path)}"
end
Mut nãorabalho no ambiente de "desenvolvimento" (as rotas estão vazia
Por enquanto, parece que tenho coisas funcionando no modo de desenvolvimento executando o mesmo código emconfig.to_prepare
que eu entendo acontece antes de cada solicitação. Infelizmente usandoto_prepare
sozinho não parece funcionar no modo de teste, daí a duplicaçã
Estou curioso para saber por que as rotas são carregadas antes do after_initialize no modo de teste, mas não no modo de desenvolvimento. E realmente, qual é o melhor gancho para isso? Existe um único gancho que funcione para todos os ambientes?
*EDITAR
sugestão de @ mu de recarregar as rotas foi ótima. Isso me deu acesso consistente às rotas dentro de after_initialize em todos os ambientes. No entanto, para o meu caso de uso, acho que ainda preciso executar o código de to_prepare, pois estou definindo um atributo de classe em um modelo e os modelos são recarregados antes de cada solicitaçã
Então aqui está o que eu acabei fazendo.
[: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
Parece um pouco confuso para mim. Eu acho que prefiro fazer algo como:
config.after_initialize do
User.exclude_routes_from_usernames!
end
config.to_prepare do
User.exclude_routes_from_usernames!
end
Mut eu não tenho certeza seUser
é o lugar certo para examinarRails.application.routes
. Acho que eu poderia fazer a mesma coisa com o código na lib / mas não tenho certeza se isso também está cert
utra opção é aplicar a sugestão de mu em to_prepare. Isso funciona, mas parece haver um atraso perceptível ao recarregar as rotas em todas as solicitações no meu ambiente de desenvolvimento, por isso não tenho certeza se essa é uma boa ligação, embora seja, pelo menos, SEC
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