Проблема с возвратом значений из вспомогательного метода в Rails - PullRequest
1 голос
/ 14 апреля 2010

Я хочу напечатать некоторые объекты в таблице, имеющей 2 строки на объект, например:

<tr class="title">
    <td>Name</td><td>Price</td>
</tr>
<tr class="content">
    <td>Content</td><td>123</td>
</tr>

Я написал вспомогательный метод в products_helper.rb, основанный на ответе на этот вопрос .

def write_products(products)
  products.map {
    |product|
    content_tag :tr, :class => "title" do
      content_tag :td do
        link_to h(product.name), product, :title=>product.name
      end
      content_tag :td do
        product.price
      end
    end
    content_tag :tr, :class => "content" do
      content_tag :td, h(product.content)
      content_tag :td, product.count
    end
  }.join
end

Но это не работает, как ожидалось. Возвращает только последний узел - последний <td>123</td>

Что я должен сделать, чтобы это работало?

1 Ответ

2 голосов
/ 14 апреля 2010

Помните, что функция content_tag возвращает строку. Он не пишет прямо на страницу. Итак, что вы делаете с TD, это:

content_tag :tr do
  content_tag :td do
    link_to h(product.name), product, :title=>product.name
  end
  content_tag :td do
    product.price
  end
end

Что, если мы оценим это частично, будет

content_tag :tr do
  "<td title='Ducks'> <a ...>Ducks</a></td>"
  "<td>19</td>"
end

И в блоке последнее значение является тем, которое возвращается. Есть две строки, но первая просто теряется в эфире. Вторая строка является последним значением в блоке и возвращается.

Что вам нужно сделать, это поместить + между ними, чтобы сложить вместе строки:

content_tag :tr do
  (content_tag(:td) do
    link_to h(product.name), product, :title=>product.name
  end) + #SEE THE PLUS IS ADDED HERE
  (content_tag(:td) do
    product.price
  end)
end

Вы должны сделать то же самое на уровне TR, просто добавьте туда плюс после окончания первого тега content_

...