当我在本地进入rails控制台时,我需要能够从控制器中看到所有类后代。我有我的所有Api控制器继承的Api::BaseController
。我遇到的问题是当我跳到rails控制台检查后代中的哪个Api控制器时,它会一直空着,直到我打电话给他们。这可能与开发中的类如何不加载,并且它们不在本地缓存有关。
sample_app$ rails c
Loading development environment (Rails 4.2.0)
2.1.5 :001 > Api::BaseController.descendants
=> []
2.1.5 :002 > Api::V1::FoosController
=> Api::V1::FoosController
2.1.5 :003 > Api::BaseController.descendants
=> [Api::V1::FoosController]
从这个例子中,你可以看到我第一次在Api::BaseController
上调用后代时,它是一个空数组。在调用其中一个控制器之后,该类将被加载并将显示为后代。在这种情况下,V1中可能有任意数量的控制器以及V2,V3等......
作为一个愚蠢的丑陋黑客,我可以做到
Dir.glob("#{Rails.root.join('app', 'controllers', 'api', 'v1')}/**/*.rb").each(&method(:require_dependency))
但每次进入控制台时我都不想写。我也在创作一个宝石,绝对不想把这种代码放在我的宝石中。
另一种选择是在开发中缓存类,但这会导致它自身的巨大问题。有人有什么想法吗?
修改
另一种选择是致电Rails.application.eager_load!
。如果我只能在API文件夹中指定控制器,则此选项可以正常工作。然后我不必急于加载整个应用程序,而只需要我需要的一小部分控制器。
答案 0 :(得分:4)
我找到了以下帖子:http://avinmathew.com/using-rails-descendants-method-in-development/
简而言之,它说:
在enviroments/development.rb
中添加以下内容:
config.eager_load_paths += Dir['path/to/files/*.rb']
ActionDispatch::Reloader.to_prepare do
Dir['path/to/files/*.rb'].each {|file| require_dependency file}
end
第一行添加启动应用程序(或控制台)时应加载的路径 其余的告诉rails在每个请求上重新加载类。
答案 1 :(得分:0)
您最好的选择可能是查看Rails.application.railties
,其中包含初始值列表。 Rails.application.eager_load!
就这些问题调用eager_load!
。可能只是找到合适的人。
如果您正计划制作rails插件,那么可能有一种非常简单的方法来访问您的插件创建的初始化程序。 This blog讨论了为插件创建初始值设定项,这可能有所帮助。