ruby-on-rails - 在 Rails 开发中加载类后代

标签 ruby-on-rails ruby

当我在本地进入 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/

相关文章:

mysql - 列数据太长 - Rails 4 迁移已取消

ruby-on-rails - 启动和运行 Rails 的最快方法是什么

ruby - 未定义方法 `new' 为 nil :NilClass error while unzipping using archive-zip in ruby

ruby-on-rails - 如何使用 strong_parameters 允许除 user_id 之外的所有属性?

ruby-on-rails - 在Omniauth和Ruby on Rails 3中使用YouTube登录

ruby-on-rails - 如何在记录更新期间从验证中排除密码字段? ( rails 3.0.4, ruby 1.9.2)

ruby-on-rails - rails 3.1 : how to run an initializer only for the web app (rails server/unicorn/etc)

ruby-on-rails - 如果项目存在 x 次则运行代码

sql - ActiveRecord 查询在 DISTINCT 之后强制执行 ORDER BY

ruby-on-rails - Searchkick AWS凭证到期