当我在本地进入 Rails 控制台时,我需要能够看到来自 Controller 的所有类后代。我有这个 Api::BaseController
,我所有的 Api Controller 都继承自它。我遇到的问题是,当我进入 Rails 控制台检查后代中有哪个 Api Controller 时,在我调用它们之前它是空的。这可能与开发中的类不急于加载以及它们不在本地缓存有关。
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
上的后代时,它是一个空数组。在调用其中一个 Controller 之后,该类将被加载并显示为后代。在这种情况下,V1 以及 V2、V3 等中可能有任意数量的 Controller ......
作为一个愚蠢丑陋的黑客,我可以做到
Dir.glob("#{Rails.root.join('app', 'controllers', 'api', 'v1')}/**/*.rb").each(&method(:require_dependency))
但我不想每次进入控制台时都必须这样写。我也在开发一个 gem,绝对不想把这种代码放在我的 gem 中。
另一种选择是在开发中缓存类,但这本身会导致很大的问题。有人有什么想法吗?
编辑
另一种选择是调用 Rails.application.eager_load!
。如果我只能在我的 API 文件夹中指定 Controller ,这个选项就可以正常工作。这样我就不必急于加载整个应用程序,而只需加载我需要的一小部分 Controller 。
最佳答案
我找到了以下帖子: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 在每次请求时重新加载类。
关于ruby-on-rails - 在 Rails 开发中加载类后代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29662518/