【问题标题】:Iterating in rails view over multiple variables在 Rails 视图中迭代多个变量
【发布时间】:2013-08-22 21:40:18
【问题描述】:

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

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

这目前将我想要查看的行复制了 4 倍(大概是因为我有 4 个 do 块正在进行,并且没有正确使用它们来实现我的目标。关于如何使这项工作以及我做什么的任何提示'm do-ing 错了(对不起,我忍不住)?还愿意接受有关如何比我使用 4 个变量的愚蠢方式更干净地执行此操作的建议?提前致谢!

【问题讨论】:

  • 值得在您的问题中添加您的预期输出。您想要每个 @list_items 元素、每个 @i_items 元素还是每个 @details 元素一行?

标签: ruby-on-rails ruby view erb


【解决方案1】:

所以我从中得到的是,你有这 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 %>

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

【讨论】:

  • each_with_index 在这里可能比 upto 更有意义:@list_items.each_with_index do |item, index|
  • 你是对的,可能不是一个好主意。你关于重新设计我的模型的评论让我意识到我已经准备好所有的关联来对此保持聪明。我不需要控制器中的所有这些变量。我将我认为是一个很好的解决方案放在下面的答案中。 +1 的建议和回答,谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2020-01-30
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    相关资源
    最近更新 更多