我使用一个标准的.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>
我确信我做错了什么,但我看不出来。
您试图在单个对象上调用这些方法,而不是在它们的数组(支持last
和map
(上调用。
@product
是一个模型对象,而不是它们的数组,这正是您所期望的。
从你的代码,你想要:
@product.contracts.last
或
@product.contracts.map{|contract| contract.author.full_name}.join(",")
因为契约(假定(是对CCD_ 7和CCD_。
<% @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 %>