2010-10-29 2 views
1

Извините, я не знаю, как назвать этот вопрос.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(", ") %>, но не разрешен. Ошибка.

Спасибо. Мне нравится сообщество переполнения стека. Вы, ребята, были намного больше, чем просто потрясающе!

EDIT

Я просто заметил, что-то. Walmart находится в городе 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(", ")) %> 

EDIT:

Как Injekt указывал, и в целях полноты, вы можете также злоупотребляйте Символ # to_proc и использование:

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

EDIT 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 –

+0

Фактически, символ # to_proc является частью активной поддержки рельсов <3 в ruby ​​1.8.6/7, поэтому он доступен. Основная проблема заключается в том, что я не хотел загромождать ответ синтаксическим обманом; но я добавлю пример только для полноты. – TreyE

+0

А я не знал о поддержке ActiveSupport. Интересно, и нет, я согласен, что я бы не использовал его в качестве официального ответа. –

-1

Попробуйте это!

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

Вместо цикла по именам, которые необходимо соединить элементы вместе

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

должен работать при условии, city.spots является массив, в противном случае вам нужно .map, используемый TreyE.

Смежные вопросы