さて、私がやりたいのは、親クラスにテンプレートを持ち、デフォルトのテンプレートにパーシャルをロードすることです。ただし、その部分は派生クラスに固有である必要があります。
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
- app/views/data_item/_col_info.html.erb
- アプリ/ビュー/foo_data_item/_col_info.html.erb
- app/views/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>
したがって、アイテム オブジェクトだけのパーシャルをロードできることはわかっていますが、私がロードしたのは、オブジェクトだけでなくサブ パーシャルのパーシャルでした。
1 つのオプションは、views/data_item/_col_info.html.erb に単一のパーシャルを作成し、if/else ブロックだけを作成して別のパーシャルをロードすることですが、STI でそれを行うためのよりクリーンな方法があることを望んでいました。
また、ビューのディレクトリ構造にアンダースコアがあるため、パスを生成する方法として item.type を使用できないことに注意してください (タイプは foodataitem になりますが、foo_data_item が必要です)。