#ruby-on-rails #ruby #ruby-on-rails-3
#ruby-on-rails #ruby #ruby-on-rails-3
Вопрос:
Я использую стандартный цикл .each для перечисления имен авторов, назначенных контракту для конкретного проекта.
Это работает нормально, когда есть только один автор:
<% @product.contracts.each do |product| %>
<%= product.author.full_name %>
<% end %>
Но более одного автора, и это выглядит действительно уродливо. Итак, я попробовал это:
<% @product.contracts.each do |p| %>
<%= p.author.full_name %>
<%= "," unless p == @product.last %>
<% end %>
Но это не сработало. Я получил: undefined method last for #<Product:0x105e7ac38>
Затем я попробовал это: <%= @product.map{|p| p.author.full_name}.join(",") %>
Это тоже не сработало. Я получил: undefined method map for #<Product:0x105c6d760>
Я уверен, что делаю что-то глупое неправильно, но я не вижу этого.
Ответ №1:
Вы пытаетесь вызвать эти методы для отдельного объекта, а не для их массива (который поддерживает last
и map
).
@product
это объект модели, а не их массив, чего вы ожидаете.
Из вашего кода вы хотите:
@product.contracts.last
или
@product.contracts.map{|contract| contract.author.full_name}.join(",")
потому что contracts (предполагая) — это массив, который отвечает на map
и last
.
Ответ №2:
<% @product.contracts.each do |p| %>
<%= p.author.full_name %>
<%
# No point comparing p which is a contract object as it will never match with
# a product object and as mentioned before, @product is not an array so
# .last wont work
%>
<%= "," unless p == @product.last %>
<% end %>
Возможное решение:
<% @product.contracts.each do |p| %>
<%= p.author.full_name %>
<%= "," unless p == @product.contracts.last %>
<% end %>