在rails视图中迭代多个变量

时间:2013-08-22 21:40:18

标签: ruby-on-rails ruby view erb

我正在从几个不同模型的几个不同变量中访问属性。我正在尝试找到在表格中显示这些属性的最佳方法,并且在我的视图中我得到了一些不需要的重复。这是我表格的相关部分。

<% @list_items.each do |l| %>
  <% @i_items.each do |i| %>
    <% @details.each do |d| %>
      <% @vends.each do |v| %>
        <tr>        
          <td><%= d.product %></td>
          <td><%= d.brand %></td>
          <td><%= d.details %></td>
          <td><%= i.price %></td>
          <td><%= v.name %></td>
          <td><%= v.address %></td>
          <td><%= button_to "Delete", {:controller => :list_items, 
                        :action => 'destroy', 
                        :id => l.id}, 
                        :method => :delete %></td>
        </tr>
      <% end %>
    <% end %>
  <% end %>
<% end %>

这目前复制了我想要查看4x的行(大概是因为我有4个do块正在进行并且我没有正确使用它们来实现我的目标。任何关于如何使这个工作的提示和我是do - 错了(对不起自己)?还有一些关于如何比我使用4个变量的愚蠢方式干净利落的建议?提前谢谢!

2 个答案:

答案 0 :(得分:2)

所以我从中得到的是你想要一次迭代这4个列表吗?如果这是问题,请执行以下操作:

<% 0.upto(@list_items.count) do |i| %>
  <tr>        
     <td><%= @details[i].product %></td>
     <td><%= @details[i].brand %></td>
     <td><%= @details[i].details %></td>
     <td><%= @i_items[i].price %></td>
     <td><%= @vends[i].name %></td>
     <td><%= @vends[i].address %></td>
     <td><%= button_to "Delete", {:controller => :list_items, 
                    :action => 'destroy', 
                    :id => @list_items[i].id}, 
                    :method => :delete %></td>
  </tr>
<% end %>

这假设所有数组都是相同的长度,并且该顺序没有被改变。这不是一个真正安全的想法,重新设计你的模型可能是值得研究的东西。

答案 1 :(得分:1)

感谢@kristenmills的建议,我意识到我已经有了必要的关联,可以用下面的代码干净利落地做到这一点。如果我发布了所有关联并给出了更多背景信息,那么有人可能会指出这一点。

<% @list_items.each do |l| %>
<tr>
        <td><%= l.item.product %></td>
        <td><%= l.item.brand %></td>
        <td><%= l.item.details %></td>
        <td><%= l.inventory_item.price %></td>
        <td><%= l.inventory_item.vendor.name %></td>
        <td><%= l.inventory_item.vendor.address %></td>
        <td><%= button_to "Delete", {:controller => :list_items, 
                        :action => 'destroy', 
                        :id => l.id}, 
                        :method => :delete %></td>
</tr>
<% end %>