0

以下は、2 つの部分的な 2 つのループです。

ループ 1 とパーシャル 1

<%@loop1.map do |p| %> 
<li>
    <%= image_tag p.product.image.url, :size=>"400x250"%>
    <br \>
    <p><%=p.product.text%></p>
    <div class="pull-right">From: <u><%=p.product.user%></u></div>
    <%end%>
</li>
<%end%>

ループ 2 とパーシャル 2

<%@loop2.map do |p| %> 
<li>
    <%= image_tag p.product2.image.url, :size=>"400x250"%>
    <br \>
    <p><%=p.product2.text%></p>
    <div class="pull-right">From: <u><%=p.product2.user%></u></div>
    <%end%>
</li>
<%end%>

index.html.erb ファイルで ajax を使用しているため、以下の 2 つの div を上記でレンダリングされたデータに置き換えます。

<div class="loop1_results"></div>
<div class="loop2_results"></div>

ですから、今起こっていることset of loop1 resultsは、最初に来て、次に来るということset of loop2 resultsです。私がやりたいのは、表示の順序を交互にすることです。したがって、loop1 ブロックが表示され、次に loop2 ブロックが表示されます。

どうすればいいのですか ?

提案やヘルプをいただければ幸いです。これをすべて 1 つのパーシャルで行うことができる場合は、どうすればよいですか?

更新: Loop1 と loop2 は配列で、サイズが異なります。

4

2 に答える 2

1

Ajax を使用している場合は、おそらく .js.erb (または Coffee を使用) があります。Javascript ファイル内で、データをロードする場所を選択できます。たとえば、次のようなものがあります。

$(".loop1_results").html("<%= render :partial => @partial1 %>");
$(".loop2_results").html("<%= render :partial => @partial2 %>");

@partial1アクションでは、「ランダム」機能を使用して、名前を付けて保存することを選択できます@partial2

また!さまざまなプロパティがあることを忘れていました。追加の変数を渡して必要な変数を指定するか、コレクション間で共通のメソッドを作成してデータを取得できます

アップデート

psharma 次のコードがあります。

$("div. loop1_results").append("<%= escape_javascript (render :partial => 'loop1') %>");
$("div. loop1_results").append("<%= escape_javascript (render :partial => 'loop2') %>");

ここで、'loop1' と 'loop2' をレンダリングする代わりに、前に示したように変数 @partial1 と @partial2 を使用します。この変数には「loop1」と「loop2」が含まれますが、これらの変数に保存する値は、たとえば「ランダム」関数によって選択されます (これはダミーの例です。これをよく理解してください):

if (rand()*10).to_i%2 == 0
   @partial1 = 'loop1'
   @partial2 = 'loop2'
else
   @partial1 = 'loop2'
   @partial2 = 'loop1'
end

更新 #2

psharma 私はあなたのことを理解していると思います。最善の方法は、両方のコレクションを 1 つに統合し、部分的なものを 1 つだけにすることだと思います。両方のコレクションが異なるテーブル (モデル) から取得されているとおっしゃいました。そのため、パーシャルを 1 つだけにするためにできることはget_product、 のモデル内で呼び出されるメソッドを作成することです。ここで、またはpを取得するかどうかを選択します。product1product2

これで、両方のコレクションを統合できますが、単純にはできません@loop1 + @loop2。あなたができることは次のようなものです(私はそれをテストしていません。これをもっと良くしてください):

@data = []
total = @loop1.count + @loop2.count - 1
for i in 0..total
  if (i%2 == 0 || @loop2.empty?) && !@loop1.empty?
      @data << @loop1.pop
  elsif !@loop2.empty?
      @data << @loop2.pop 
  end
end
于 2013-04-02T16:28:53.557 に答える
1

@loop1とが同じサイズであると仮定する@loop2と、次のコードで特定の問題を解決できます。

<% (0..@loop1.size - 1).each do |i| %>

<% p = @loop1[i] %>
<li>
    <%= image_tag p.product.image.url, :size=>"400x250"%>
    <br \>
    <p><%=p.product.text%></p>
    <div class="pull-right">From: <u><%=p.product.user%></u></div>
    <%end%>
</li>

<% p = @loop2[i] %>
<li>
    <%= image_tag p.product2.image.url, :size=>"400x250"%>
    <br \>
    <p><%=p.product2.text%></p>
    <div class="pull-right">From: <u><%=p.product2.user%></u></div>
    <%end%>
</li>

<%end%>

データ構造について詳しく知らなければ、よりクリーンなソリューションを提供することはできません。

于 2013-04-02T16:34:29.833 に答える