2009-07-22 2 views
1

私はいくつかの異なるクラスのインスタンスを含むコレクションを持っており、それぞれのインスタンスに対して部分をレンダリングしたいと思います。Railsで異なるクラスのコレクションをレンダリングする

<%= render @results %> 

私の質問は次のとおりです。異なるパーツを別のベースディレクトリにレンダリングするにはどうすればよいですか?上記のコードはapp/views/stories/_story.html.erbを探しますが、このアクションの部分はすべて別のディレクトリ(app/search/_story.html.erb)に保存されています。これを指定する方法はありますか?

答えて

2

次のようなヘルパーメソッドを作成できます

def render_results(results) 
    result_templates = {"ClassA" => "search/story", "ClassB" => "something/else"} 
    results.each do |result| 
    if template = result_templates[result.class.name] 
     concat render(:partial => template, :object => result) 
    end 
    end 
end 

をそしてビューコール<% render_results(@results) %>

1

に私は私のような各クラスの部分を使用するので、私は複数のクラスを持って似たような状況を持っています:

for result in @results 
    = render :partial => "result_#{result.class.to_s.downcase}", :locals => {:item => result} 
end 
+1

これは私がマルチモードの検索結果に使うものです。一つの違いがあります:地方と 'for'または' each'ブロックを使う代わりに ':collection'を使って' @ results'を渡すと、各オブジェクトが割り当てられますその部分的な 'partialname'変数に置き換えます。これにより、異なるクラスのビューコンテキストについて「アイテム」(抽象的なものではない)のような抽象変数が散らばり、セマンティックセンスが維持されなくなります。 'school.address'と' item.address'を 'school'部分の中で使います。デフォルトの 'classnames/_classname'部分的な場所を使いたくない場合は少し複雑です。 – Eric

+0

きれいに置く@エリック –

2

か、のis_aを使用することができます(オブジェクト)

012?
関連する問題