2010-10-29 26 views
1

对不起,我不知道如何标题这个问题。Rails - 加入每个

这里是我的代码在视图:

<% country.cities.each_with_index do |city, i| %> 
    <% city.shops.each do |shop| %> 
    <%=h shop.name.join(", ") %> 
    <% end %> 
<% end %> 

因此,在这个城市里,让我们说有三个店:沃尔玛,Ace五金,哈曼卡顿。

上面代码的结果将产生:

Walmart Ace Hardware Harman Kardon 

如何加入与他们每个人的“”?我试过<%= shop.name.join(", ") %>,但不允许。错误。

谢谢。我喜欢Stack Overflow社区。你们已经更多了,远胜于真棒!

编辑

我只是发现了一些。沃尔玛在A市; Ace HArdware和Harman Kardon在B市。这就是为什么它按城市来加入城市。

回答

8

代码:

<%= shop.name.join(", ") %> 

就不行,因为你已经是块内,并加入特定于可枚举,其中在这一点上,你只是有任何对象的方法。

你想要的这里居然是:

<%= city.spots.map { |shop| shop.name }.join(", ") %> 

这部作品的原因是因为:

city.spots.map { |shop| shop.name } 

会给你所有的商店,名称的数组,你可以再加入使用您选择的字符串。

您可能还需要确保你的HTML逃脱的名字(以防万一):

<%= h(city.spots.map { |shop| shop.name }.join(", ")) %> 

编辑:

由于injekt指出,和完整的目的,你也可以滥用符号#to_proc及用途:

<%= city.spots.map(&:name).join(", ") %> 

编辑PART2:

现在我们有新的周边块,我们需要重新编写表达式:

<%= h(country.cities.map { |city| city.shops }.flatten.map { |shop| shop.name }.join(", ")) %> 
+1

当然,如果您使用的是Ruby 1.9,则可以使用'Symbol#to_proc'语法,如下所示:'city.spots.map(&:name).join(',')'。另外在Rails 3中,你不需要使用'h'来转义HTML,因为这在默认情况下在Erubis – 2010-10-29 16:41:12

+0

中完成。实际上,Symbol#to_proc是ruby 1.8.6/7中rails <3的主动支持的一部分,所以它是可用的。主要的问题是我不想用句法欺骗来混淆答案;但为了完整性,我会添加示例。 – TreyE 2010-10-29 16:43:41

+0

啊我不知道ActiveSupport支持这个。有趣的,不,我同意我也不会用它作为正式答案。 – 2010-10-29 16:46:44

-1

试试这个吧!

<% c = [] %> 
<% city.spots.each do |shop| %> 
    <% c << shop.name %> 
    <%= shop.name %> 
<% end %> 
0

而是遍历你需要的元素结合在一起

<% city.spots.join(', ') %> 

应工作假设city.spots是一个数组的名字,否则,你需要.MAP作为TreyE使用。