代码之家  ›  专栏  ›  技术社区  ›  Victor

轨道-连接每个轨道

  •  1
  • Victor  · 技术社区  · 15 年前

    下面是我的代码:

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

    所以在这个城市,假设有三家商店:沃尔玛,王牌五金,哈曼卡顿。

    上述代码的结果将产生:

    Walmart Ace Hardware Harman Kardon
    

    我如何用“,”来连接它们?

    我试过了 <%= shop.name.join(", ") %>

    谢谢。我喜欢堆栈溢出社区。你们真是太棒了!

    编辑

    3 回复  |  直到 15 年前
        1
  •  8
  •   TreyE    15 年前

    代码:

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

    不会工作,因为您已经在块中了,join是一个特定于可枚举的方法,此时您只拥有任何对象。

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

    之所以有效,是因为:

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

    将为您提供所有商店的名称数组,然后您可以使用选择的字符串加入。

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

    编辑:

    正如injekt所指出的,为了完整起见,您还可以滥用Symbol来处理和使用:

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

    编辑第二部分:

    现在有了新的包围块,我们需要重新编写表达式:

    <%= h( country.cities.map { |city| city.shops }.flatten.map { |shop| shop.name }.join(", ") ) %>
    
        2
  •  0
  •   Chris Hulan    15 年前

    而不是在需要将元素连接在一起的名称上循环

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

    假设city.spots是一个数组,否则就需要.map作为TreyE使用。

        3
  •  -1
  •   krunal shah    15 年前

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