4

さて、私がやりたいのは、親クラスにテンプレートを持ち、デフォルトのテンプレートにパーシャルをロードすることです。ただし、その部分は派生クラスに固有である必要があります。

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 が必要です)。

4

1 に答える 1

1

クラスの名前だけを使用してパスを生成することはできませんが、次のようなことができます。

item.class.name.underscore

template_pathこれは、各クラスにメソッドを追加するよりも便利です。underscore メソッドは ActiveRecord から来ており、キャメル ケースのクラス名を正しい形式に変換します。

于 2012-06-20T22:59:31.413 に答える