4
好吧,所以我想要做的是在父类中有一个模板,它在默认模板中加载一个部分。这部分虽然应该是特定于派生类。Rails 3 STI负载派生部分
def class DataItem < ActiveRecord::Base
def value
# do something fancy here
end
end
def class FooDataItem < DataItem
def value
"foo"
end
end
def class BarDataItem < DataItem
def value
"bar"
end
end
然后,我们有以下的视图结构:
- 应用/视图/ data_item/index.html.erb
- 应用/视图/ data_item/_col_info.html.erb
- 应用程序/视图/ foo_data_item/_col_info.html.erb
- 应用/视图/ bar_data_item/_col_info.html.erb
在index.html.erb,我们有这样的事情:
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<% @dataItems.each do |item| %>
<tr>
<td><%= render :partial, item + "/col_info", :locals => { :item => item } %>
<td><%= item.value %>
</tr>
<% end %>
</tbody>
</table>
所以,我知道我可以加载部分只是该项目的对象,但我是一个局部的,是不是只为对象,但一个子部分。
一种选择是在views/data_item/_col_info.html.erb中创建一个只包含if/else块的单个部分,然后加载一个单独的部分,但我希望有一个更清晰的方法来做到这一点STI。
另外请注意,我不能使用item.type作为生成路径的方法,因为我在视图目录结构中有下划线(类型为foodataitem,但我需要foo_data_item)。
所以,这不是我的想法解决方案,但我确实在基类“template_path”中创建了一个被子类覆盖的函数。仍然不知道,但它至少让我这样做。 – alex