9

私は次のものを持っています:

sets = DataSet.all.group_by{ |data| [data.project_id, "-", data.thread_id].join(" ") }

<% sets.each do |range, datas| %>
  <p><%= range %>:</p>
  <% datas.each do |data| %>
     <%=data%>
    <p>Last Post<%= data.last.created_at %></p>
  <% end %>
<% end %>

問題は、インデックスが必要なことです。だから私は上記を更新しました:

<% sets.each_with_index do |range, datas, i| %>
  <p><%= range %>:</p>
  <% datas.each do |data| %>
     <%= i %>
     <%=data%>
    <p>Last Post<%= data.last.created_at %></p>
  <% end %>
<% end %>

その後、エラーが発生して中断します:undefined method `last'for 0:Fixnum

アイデア?ありがとうございました

4

1 に答える 1

17

観察される問題は、パラメータがブロックに割り当てられる方法が原因です。2番目の例では、がrange単一rangeの一致する配列を含みdatasdatas変数がインデックスを含み、i常にであることがわかりnilます。

これは、rubyがブロックへの唯一のパラメーターである場合、配列を「スプラット解除」するためです。複数の型(この場合は配列と整数)がある場合は、ルビーに何をすべきかを示唆する必要があります。最も簡単な方法は、括弧を使用することです。

<% sets.each_with_index do |(range, datas), i| %>
  ...
<% end %>

そうすれば、rubyはあなたが何を意味するのかを知り、配列をとに分割しrangeますdatas。これは、実際には、コンマ演算子と組み合わせたルビーの代入演算子の機能です。それはこのように動作します

my_array = [1, 2]
(x, y) = my_array
p x                # prints 1
p y                # prints 2
于 2011-02-12T22:38:04.043 に答える