【发布时间】:2012-11-21 17:49:13
【问题描述】:
我有一个包含几个不同类的实例的集合,我想为每个实例呈现部分。我可以使用以下代码来做到这一点:
<%= render @results %>
我的问题是:如何在不同的基本目录中呈现不同的部分?上面的代码将查找 app/views/stories/_story.html.erb,但是,此操作的部分内容都保存在不同的目录中 - app/search/_story.html.erb。有什么方法可以指定吗?
【问题讨论】:
我有一个包含几个不同类的实例的集合,我想为每个实例呈现部分。我可以使用以下代码来做到这一点:
<%= render @results %>
我的问题是:如何在不同的基本目录中呈现不同的部分?上面的代码将查找 app/views/stories/_story.html.erb,但是,此操作的部分内容都保存在不同的目录中 - app/search/_story.html.erb。有什么方法可以指定吗?
【问题讨论】:
你可以像这样创建一个辅助方法:
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) %>
【讨论】:
或者你可以使用 is_a?(Object)
if is_a?(classA)
render something_A
elsif is_a?(classB)
render something_B
end
【讨论】:
我有一个类似的情况,我有多个类,所以我为每个类使用一个部分,例如:
for result in @results
= render :partial => "result_#{result.class.to_s.downcase}", :locals => {:item => result}
end
【讨论】:
:collection 传入 @results 而不是使用本地变量和 for 或 each 块,则每个对象被分配给其部分的partialname 变量。这避免了像“item”(无意冒犯!)这样的抽象变量散布在不同类的视图上下文中,并保留了语义,例如school.address 与 item.address 在 school 部分内。如果您不想使用默认的classnames/_classname 部分位置,那就有点复杂了。