2009-07-22 26 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

这是我用于多模型搜索结果的一个区别:如果您通过`:结果`通过`:collection`而不是使用本地和`for`或`每个`块,每个对象被分配到其部分的`partialname`变量。这避免了抽象的变量,比如“item”(没有冒犯!)散布在不同的类的视图上下文中,并保留了语义上的意义。 `school.address`与`school`部分内的`item.address`。如果你不想使用默认的`classnames/_classname`部分位置,这会更复杂一些。 – Eric 2014-03-29 17:19:53

2

,或者您可以使用is_a(对象)

012?