Rails инициализатор, который запускается * после * загрузки маршрутов?
Я хочу установить атрибут класса при запуске моего приложения Rails. Требуется проверка некоторых маршрутов, поэтому маршруты должны быть загружены до запуска моего пользовательского кода. У меня проблемы с поиском надежного места, чтобы зацепиться.
Это работает ОТЛИЧНО в «тестовой» среде:
config.after_initialize do
Rails.logger.info "#{Rails.application.routes.routes.map(&:path)}"
end
Но этоне работа в среде разработки (маршруты пусты)
На данный момент у меня, кажется, есть вещи, работающие в режиме разработки, запустив тот же код вconfig.to_prepare
что я понимаю, происходит перед каждым запросом. К сожалению используяto_prepare
Кажется, что один не работает в тестовом режиме, следовательно, дублирование.
Мне любопытно, почему маршруты загружаются перед after_initialize в тестовом режиме, но не в режиме разработки. И действительно, что является лучшим крючком для этого? Есть ли один хук, который будет работать для всех сред?
*РЕДАКТИРОВАТЬ*
Предложение мю о перегрузке маршрутов было отличным. Это дало мне постоянный доступ к маршрутам в 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 /, но я не уверен, что это тоже правильно.
Другой вариант - просто применить предложение mu к to_prepare. Это работает, но, кажется, есть заметная задержка перезагрузки маршрутов при каждом запросе в моей среде разработки, поэтому я не уверен, что это хороший вызов, хотя, по крайней мере, это СУХОЙ.
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