抱歉,我真的不知道如何标题这个问题。
以下是我的代码:
<% country.cities.each_with_index do |city, i| %>
<% city.shops.each do |shop| %>
<%=h shop.name.join(", ") %>
<% end %>
<% end %>
所以在这个城市,让我们说有三家商店:Walmart,Ace Hardware,Harman Kardon。
上述代码的结果将产生:
Walmart Ace Hardware Harman Kardon
如何使用“,”加入每一个?
我尝试<%= shop.name.join(", ") %>
但不允许。错误。
感谢。我喜欢Stack Overflow社区。你们这些人不仅仅是太棒了!
修改
我刚注意到了一些事情。沃尔玛在A市; Ace HArdware和Harman Kardon都在B市。这就是为什么它逐个城市的加入。
答案 0 :(得分:8)
代码:
<%= shop.name.join(", ") %>
不会起作用,因为你已经在块中,而join是一个特定于枚举的方法,此时你只需拥有任何对象。
你想要的是:
<%= city.spots.map { |shop| shop.name }.join(", ") %>
这有效的原因是:
city.spots.map { |shop| shop.name }
将为您提供所有商店的名称数组,然后您可以使用您选择的字符串加入。
您可能还想确保html转义名称(以防万一):
<%= h( city.spots.map { |shop| shop.name }.join(", ") ) %>
编辑:
正如injekt指出的那样,为了完整起见,您还可以滥用Symbol#to_proc并使用:
<%= city.spots.map(&:name).join(", ") %>
编辑PART2:
现在我们有了新的周边块,我们需要重新编写表达式:
<%= h( country.cities.map { |city| city.shops }.flatten.map { |shop| shop.name }.join(", ") ) %>
答案 1 :(得分:0)
而不是循环遍历连接元素所需的名称
<% city.spots.join(', ') %>
假设city.spots是一个数组,应该工作,否则你需要使用.map作为TreyE使用。
答案 2 :(得分:-1)
试试这个!
<% c = [] %>
<% city.spots.each do |shop| %>
<% c << shop.name %>
<%= shop.name %>
<% end %>