Rails - Присоединяйтесь к каждому - PullRequest
1 голос
/ 29 октября 2010

Извините, я не знаю, как озаглавить этот вопрос.

Вот мой код:

<% 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. Вы, ребята, были больше, намного более чем удивительными!

EDIT

Я только что заметил что-то. Walmart находится в городе A; Ace HArdware и Harman Kardon находятся в городе B. Именно поэтому он присоединился к городу за городом.

Ответы [ 3 ]

8 голосов
/ 29 октября 2010

Код:

<%= 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, и в целях полноты вы также можете использовать Symbol # to_proc и использовать:

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

EDIT PART2:

Теперь, когда у нас есть новый окружающий блокнам нужно переписать выражение:

<%= h( country.cities.map { |city| city.shops }.flatten.map { |shop| shop.name }.join(", ") ) %>
0 голосов
/ 29 октября 2010

Вместо того, чтобы перебирать имена, вам нужно объединить элементы

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

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

0 голосов
/ 29 октября 2010

Попробуйте!

<% c = [] %>
<% city.spots.each do |shop| %>
  <% c << shop.name %>
  <%= shop.name %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...