2011-04-21 52 views
2

我使用标准的.each循环来列出分配给特定项目合同的作者姓名。Ruby on Rails .last抛出未定义的方法错误?

这工作得很好,当只有一个作者:

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

我敢肯定我正在做一些愚蠢的错误,但我看不到它。

回答

2

您试图在单数对象上调用这些方法,而不是它们的数组(支持lastmap)。

@product是模型对象而不是它们的数组,这正是您所期望的。

从你的代码,你想:

@product.contracts.last 

@product.contracts.map{|contract| contract.author.full_name}.join(",") 

因为合约(假定)是响应maplast的数组。

0
<% @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 %> 
相关问题