Eng*_*epe 5 ruby reflection inheritance metaprogramming inspect
我有一个模型对象,它是ActiveRecord的子类.此外,使用STI,我定义了此对象的子类,它定义了不同的类型和行为.结构看起来像这样:
class AppModule < ActiveRecord::Base
belongs_to :app
end
class AppModuleList < AppModule
end
class AppModuleSearch < AppModule
end
class AppModuleThumbs < AppModule
end
Run Code Online (Sandbox Code Playgroud)
现在,在用户可以选择创建新AppModule的视图中,我希望他们从下拉菜单中进行选择.但是我无法使用subclasses()方法获取AppModule的子类列表:
<% form_for(@app_module) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :type %><br />
<%= f.select(:type, options_from_collection_for_select(@app_module.subclasses().map{ |c| c.to_s }.sort)) %>
</p>
<p>
<%= f.submit 'Create' %>
</p>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我明白了:
NoMethodError: undefined method `subclasses' for #<AppModule:0x1036b76d8>
Run Code Online (Sandbox Code Playgroud)
我很感激任何帮助.非常感谢!
out*_*tis 10
它看起来subclasses好像是最近的一个添加(该方法存在于各个时间点的各个类,但不断被改组和删除;该链接似乎是该方法所停留的最早的点).如果升级到最新版本的RoR不是一个选项,您可以自己编写subclasses并使用Class#inherited它填充(这是RoR的descendents_tracker功能).
AppModule.descendants.map &:name是你在找什么.如:
<% form_for(@app_module) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :type %><br />
<%= f.select(:type, options_from_collection_for_select(AppModule.descendants.map(&:name).sort)) %>
</p>
<p>
<%= f.submit 'Create' %>
</p>
<% end %>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7497 次 |
| 最近记录: |