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

时间:2016-03-06 07:14:20

标签: ruby-on-rails ruby-on-rails-3.2

我试图访问我的引擎中的网址助手来设置rack-cors。现在,我已经为机架中间件配置中的一个网址硬编码了字符串。我已阅读the order in which Rails initializers are run,此时在加载顺序中我应该有可用的引擎路由。我想我会在事件add_routing_paths上找到它们,但是在使用pry挖掘之后我找不到路线。另一个让我觉得我不正确地做这件事的声明是文档说:"应用程序的某些部分,特别是路由,尚未在调用after_initialize块时设置。 #34;根据{{​​3}}:

  1. 要求" config / boot.rb"设置加载路径
  2. 需要铁路和发动机
  3. 将Rails.application定义为"类MyApp :: Application<导轨::应用"
  4. 运行config.before_configuration callbacks
  5. 加载config / environments / ENV.rb
  6. 运行config.before_initialize回调
  7. 运行由铁路,引擎和应用程序定义的Railtie#initializer。 每个引擎一个接一个地设置其加载路径,路由并运行其config / initializers / *文件。
  8. 执行铁路,引擎和应用程序添加的自定义Railtie#初始化程序
  9. 构建中间件堆栈并运行to_prepare回调
  10. 运行config.before_eager_load和eager_load!如果eager_load为真
  11. 运行config.after_initialize回调
  12. 我试图加入(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
    

3 个答案:

答案 0 :(得分:3)

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

  1. 将其添加到config/routes.rb文件的末尾(routes.draw块之外)
  2. ActiveSupport::Notifications.instrument 'routes_loaded.application'
    
    1. 在初始化代码中订阅此事件并使用URL帮助程序!
    2. ActiveSupport::Notifications.subscribe 'routes_loaded.application' do
        Rails.logger.info Rails.application.routes.url_helpers.home_path
      end
      

      有关详细信息,请参阅:

答案 1 :(得分:0)

在进一步研究并阅读the rack-cors example done in Rails3之后,可能无法在任何时间点检索初始化程序内的路径助手。

答案 2 :(得分:0)

在初始化后 加载它。

我需要在初始化器中使用root_url,但未正确初始化。我尝试使用Pub / Sub method that Anton Styagun suggests,但即使这样,也没有正确初始化URL Helpers。

相反,我选择在Rails应用本身初始化之后 手动加载初始化文件。这需要几个步骤:

  1. 将初始化程序从config/initializers/移到lib/

  2. 在应用程序初始化之后,需要environment.rb中的文件。我们的看起来像这样:

    CNTRAL::Application.initialize!
    
    require "my_initializer" # Omit the `lib/` because that's the load path it looks in.
    
  3. 现在,在my_initializer.rb内,我可以执行以下操作来呼叫root_url

    Rails.application.routes.url_helpers.root_url
    

    注意:重要的是不要只使用include Rails.application.routes.url_helpers

我还在初始化器和加载/要求的environment.rb中都添加了注释,以便将来对自己和其他工程师更加明显。

替代方法

您也可以使用以下方法,并且效果很好:

在您的application.rb文件中,添加:

config.after_initialize do
  Rails.application.reload_routes! # Necessary to load the Routes.
  require  "my_initializer"
end