2011-05-04 94 views
8

我想在视图中显示MyModel子类的选择列表。它不工作呢,所以对于健全检查,我包括这在我的观点:RoR:在第一次调用之后,MyModel.descendants在视图中返回[]?

<%= MyModel.descendants %> 

第一一次渲染重新启动服务器后,这个页面,它显示后裔的名单(有六个)。全部后续次,它显示为空列表[]

FWIW,我在我的初始化一个require声明:

Dir[Rails.root.join("app/models/my_models/**/*.rb").to_s].each {|f| require f} 

...我已经验证了他们得到必需的。

什么@($%&是怎么回事?

回答

7

当您使用需要,即使你my_model.rb被重新加载,因为他们已经被加载内核将不再需要你的子类.rb文件。你” ð不得不通过导轨自动加载。

基本上,你的第一个要求,导轨自动加载从my_model.rb,然后需要my_models/sub_model.rbMyModelSubModel类继承MyModel,其中填充descendants阵列。 在你然而,请求后,再次自动加载MyModel(嘿,你处于开发模式),然后再次需要my_models/sub_model.rb。但是这一次,内核知道它已经加载了这个文件,并且不会再加载它。

我在一小时前遇到了这个问题,这导致我到您的帖子,并找到一个解决方案。我们需要的是每次调用主类时自动加载子类。

这里是一个解决方案:

class MyModel 
    Dir[File.join(File.dirname(__FILE__),"my_models","*.rb")].each do |f| 
    MyModels.const_get(File.basename(f,'.rb').classify) 
    end 
end 

这些线路很可能是类的外放。如果您只有my_models中的文件而不在子目录中,那应该就足够了(这对我来说)。如果你有一些(例如MyModels::Car::Ford,你可能需要把同一种东西在子模块(在my_models/car.rb

+0

+1对于发生什么事的清晰解释 - 谢谢。不幸的是,我的子类有“首字母缩略词”名称,比如“PGEService”,其名称如“pge_service.rb”。我还没有准备好将我的文件重命名为'p_g_e_service.rb' - 至少现在还没有! – 2011-05-07 04:30:17

+0

那么,如果你的文件被命名为PGEService.rb,你可以使用文件名(不带'。classify'),但是如果它仍然是'pge_service.rb',我看不到任何简单的解决方案...除非你做's = File.basename(f,'。rb')。split('_ “); class_name = s.first.upcase + s.last.classify; MyModels.const_get(CLASS_NAME)'。是的,我知道有点难看。 – Wam 2011-05-08 16:45:03

+0

严格来说,你DID回答了我的问题“发生了什么事”。所以你应该得到复选标记。我已经完善了我的问题,但我会把它作为一个单独的问题发布。向前! – 2011-05-25 03:43:11

9

我有同样的问题,加入解决了它一个config/initializers/preload_models.rb有:。

Dir[Rails.root + 'app/models/*.rb'].map {|f| File.basename(f, '.*').camelize.constantize } 

希望帮助别人

+0

这帮了我......谢谢! – erroric 2014-09-12 20:25:28

+0

如果你不幸地使用命名空间,这将不起作用:( – mscriven 2015-06-16 15:20:29

+0

这在几分钟后仍然会在内存不足时通过初始化程序加载 – Todd 2016-12-01 21:21:18

7

我刚启用预先加载在每个环境:

config.eager_load = true

即使在为类名使用名称空间时,这也适用于我。

+0

我*认为*这将是获胜的答案。可以有人验证这个工作吗? – 2015-06-17 04:37:48

+0

这工作对我来说 – Philip7899 2016-01-20 20:06:25

+0

这是一个误报,它将工作几分钟,然后掉出内存,无论你使用这个功能的页面是什么 - 只需刷新,最终,“后代”或“子类'将再次开始返回空白。 – Todd 2016-12-01 21:22:00

相关问题