Ruby on Rails .последнее выбрасывание ошибки неопределенного метода?

#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 %>