在rails开发中加载类后代

时间:2015-04-15 23:08:48

标签: ruby-on-rails ruby

当我在本地进入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文件夹中指定控制器,则此选项可以正常工作。然后我不必急于加载整个应用程序,而只需要我需要的一小部分控制器。

2 个答案:

答案 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讨论了为插件创建初始值设定项,这可能有所帮助。