在初始化程序中访问Rails引擎的URL助手

问题描述:

我试图访问我的引擎中的url助手来设置rack-cors。现在,我对机架中间件配置中的其中一个URL进行了硬编码。我已阅读the order in which Rails initializers are run,并且在加载顺序的这一点上,我应该有可用的引擎路线。我想我会在活动add_routing_paths上提供它们,但是在使用pry进行挖掘后,我找不到路线。另一个让我认为自己做错了的陈述是文档说:“应用程序的某些部分,特别是路由,尚未设置在调用after_initialize块的位置。”据this list在初始化程序中访问Rails引擎的URL助手

  1. 需要 “配置/的boot.rb” 设置负载路径
  2. 需要railties和发动机
  3. 定义Rails.application为 “类MyApp的::应用<的Rails ::应用”
  4. 运行config.before_configuration回调
  5. 负载配置/环境/ ENV.rb
  6. 运行config.before_initialize回调
  7. 运行由Railties,引擎和应用程序定义的Railtie#初始化程序。 一个接一个,每个引擎设置它的加载路径,路由并运行它的config/initializers/*文件。
  8. 通过railties,引擎和应用程序添加自定义Railtie#初始化执行
  9. 构建中间件栈和运行to_prepare回调
  10. 运行config.before_eager_load和eager_load!如果eager_load是真的
  11. 运行config.after_initialize回调

我试图钩到(7),但也许路由不可直到(11)?

module Zillow 
    class Engine < ::Rails::Engine 
    isolate_namespace Zillow 

    # Rails.application.routes.url_helpers 

    initializer "zillow.cors", after: :set_routes_reloader do |app| 
     require 'pry'; binding.pry 
     app.config.app_middleware.insert_before 0, Rack::Cors do 
     allow do 
      origins 'localhost:3000' 
      resource '/zillow/search_results', methods: :get 
     end 
     end 
    end 
    end 
end 

这里是我的路线

zillow /zillow Zillow::Engine 

Routes for Zillow::Engine: 
       api_deep_comps GET /api/deep_comps(.:format)    zillow/api#deep_comps 
       api_zestimate GET /api/zestimate(.:format)    zillow/api#zestimate 
      api_search_results GET /api/search_results(.:format)   zillow/api#search_results 
api_updated_property_details GET /api/updated_property_details(.:format) zillow/api#updated_property_details 

的输出寻找到这进一步和阅读the rack-cors example done in Rails3后,可能无法在任何时间点来检索初始化内部的路线佣工。

当路由加载后,您可以激发自己的事件,然后在初始化期间订阅该事件以获取路由数据。对于:

  1. config/routes.rb文件的末尾添加(外routes.draw块)
ActiveSupport::Notifications.instrument 'routes_loaded.application' 
  1. 订阅此事件中的初始化代码和使用网址助手!
  2. ActiveSupport::Notifications.subscribe 'routes_loaded.application' do 
        Rails.logger.info Rails.application.routes.url_helpers.home_path 
    end 
    

    欲了解更多信息,请参阅:

开始=>
+0

感谢您的答复!我注意到你的链接指向Rails最新版本的Rails指南,第5版。我提交的原始问题和后续响应在Rails 3中寻求解决方案。 –

+0

啊,真的。我已经检查过,没有类似的Rails 3指南。但看起来,这个API已经在Rails 3中可用了:http://api.rubyonrails.org/v3.2/classes/ActiveSupport/Notifications.html 。所以解决方案也可能适用于Rails 3。 如果没有,那么也许可以通过在初始化程序中使用方法创建一个类来手动编写替代方法,然后在加载路由后调用此方法。 –