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

Mie*_*yba 6 ruby-on-rails ruby-on-rails-3.2

我正在尝试访问引擎中的 url 帮助程序来设置rack-cors。现在,我已经对 rack-cors 中间件配置中的其中一个 URL 的字符串进行了硬编码。我已经阅读了 Rails 初始化程序的运行顺序,在加载顺序的这一点上,我应该有可用的引擎路由。我以为我会在活动中提供它们add_routing_paths,但是在使用 pry 挖掘后我找不到路线。另一个让我认为我这样做不正确的声明是文档说:“您的应用程序的某些部分,特别是路由,尚未在调用 after_initialize 块时设置。” 根据这份清单

  1. 需要“config/boot.rb”来设置加载路径
  2. 需要导轨和引擎
  3. 将 Rails.application 定义为“class MyApp::Application < Rails::Application”
  4. 运行 config.before_configuration 回调
  5. 加载配置/环境/ENV.rb
  6. 运行 config.before_initialize 回调
  7. 运行由 railties、引擎和应用程序定义的 Railtie#initializer。每个引擎一个接一个地设置其加载路径、路由并运行其 config/initializers/* 文件。
  8. 自定义 Railtie#initializers 添加的 railties,引擎和应用程序被执行
  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
Run Code Online (Sandbox Code Playgroud)

这是我的路线的输出

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
Run Code Online (Sandbox Code Playgroud)

Ant*_*gun 9

您可以在加载路由时触发自己的事件,然后在初始化期间订阅该事件以获取路由数据。为了那个原因:

  1. 将此添加到config/routes.rb文件末尾(routes.draw块外)
ActiveSupport::Notifications.instrument 'routes_loaded.application'
Run Code Online (Sandbox Code Playgroud)
  1. 在初始化代码中订阅此事件并使用 URL 助手!
ActiveSupport::Notifications.subscribe 'routes_loaded.application' do
  Rails.logger.info Rails.application.routes.url_helpers.home_path
end
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅:


Mie*_*yba -1

进一步研究这一点并阅读Rails3 中完成的rack-cors 示例后,可能无法在任何时间点检索初始化程序内的路由助手。