我试图访问我的引擎中的网址助手来设置rack-cors。现在,我已经为机架中间件配置中的一个网址硬编码了字符串。我已阅读the order in which Rails initializers are run,此时在加载顺序中我应该有可用的引擎路由。我想我会在事件add_routing_paths
上找到它们,但是在使用pry挖掘之后我找不到路线。另一个让我觉得我不正确地做这件事的声明是文档说:"应用程序的某些部分,特别是路由,尚未在调用after_initialize块时设置。 #34;根据{{3}}:
我试图加入(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
答案 0 :(得分:3)
您可以在加载路由时触发自己的事件,然后在初始化期间订阅该事件以获取路径数据。为此:
config/routes.rb
文件的末尾(routes.draw
块之外)ActiveSupport::Notifications.instrument 'routes_loaded.application'
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应用本身初始化之后 手动加载初始化文件。这需要几个步骤:
将初始化程序从config/initializers/
移到lib/
。
在应用程序初始化之后,需要environment.rb
中的文件。我们的看起来像这样:
CNTRAL::Application.initialize!
require "my_initializer" # Omit the `lib/` because that's the load path it looks in.
现在,在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