Rails - 加入每一个

时间:2010-10-29 16:25:23

标签: ruby-on-rails

抱歉,我真的不知道如何标题这个问题。

以下是我的代码:

<% 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市。这就是为什么它逐个城市的加入。

3 个答案:

答案 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 %>