当我在本地进入 Rails 控制台时,我需要能够从控制器看到所有类后代。我有这个Api::BaseController
我所有的 Api 控制器都继承自它。我遇到的问题是,当我跳到 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))
但我不想每次进入控制台时都写这个。我也在开发 gem,并且绝对不想将此类代码放入我的 gem 中。
另一种选择是在开发中缓存类,但这本身会导致一个巨大的问题。有人有主意吗?
Edit另一种选择是致电Rails.application.eager_load!
。如果我只能在 API 文件夹中指定控制器,则此选项可以正常工作。然后我不必急于加载整个应用程序,而只需加载我需要的一小部分控制器。
我找到了以下帖子:http://avinmathew.com/using-rails-descendants-method-in-development/
简而言之,它说如下:
In 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 根据每个请求重新加载类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)