【问题标题】:Ruby on rails: Need help formatting view from two different loops and two different partials into one viewRuby on rails:需要帮助将来自两个不同循环和两个不同部分的视图格式化为一个视图
【发布时间】:2013-04-02 15:50:44
【问题描述】:

以下是我的两个部分的两个循环

循环 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,我将下面的两个 div 替换为上面呈现的数据

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

所以现在发生的事情是 set of loop1 results 先出现,然后是 set of loop2 results。我想要做的是交替显示的顺序。所以它会显示 loop1 块,然后是 loop2 块,依此类推。

我该怎么做?

感谢任何建议或帮助。如果这可以通过一个部分来完成,我该怎么做?

更新:Loop1 和 loop2 是数组,大小不同。

【问题讨论】:

  • @loop1@loop2 是否以某种方式关联?
  • 不。正在从两个不同的表中获取数据。不要按名字命名,我还在测试,需要修复它。
  • 如果不使用返回值,为什么要使用map

标签: ruby-on-rails ruby-on-rails-3 model-view-controller


【解决方案1】:

如果您使用的是 Ajax,您可能有一个 .js.erb(或带有 Coffee);在 Javascript 文件中,您可以选择加载数据的位置,例如,您可能有:

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

在操作中,您可以使用“随机”函数选择名称保存在 @partial1@partial2

还有!我忘了你有不同的属性,你可以传递额外的变量来指定你需要哪个变量,或者你可以在集合之间创建通用方法来获取数据

更新

你有以下代码:

$("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 我想我理解你,我认为最好的方法是将两个集合统一为一个集合,并且只有一个部分。你说这两个集合来自不同的表(模型),所以为了只有一个部分你可以做的是在p的模型内部创建一个名为get_product的方法,在这里选择如果你得到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

【讨论】:

  • 对不起,我没听懂你说的。我已经在我的 .js.erb 文件 $("div. loop1_results").append("&lt;%= escape_javascript (render :partial =&gt; 'loop1') %&gt;"); $("div. loop1_results").append("&lt;%= escape_javascript (render :partial =&gt; 'loop2') %&gt;"); 中有这些,如果您能更新解决方案中的代码,我将不胜感激。谢谢
  • 好的,我认为这可能有效:p。现在如果条件去了哪里。你在行动中说。你的意思是在控制器中?我可以将它放在我的 .js.erb 文件中吗?
  • 将条件放入动作中,您应该始终将代码放入控制器中,而视图中只放入渲染
  • 好的,明白了。它现在有点工作。您可以查看 loop1 中是否有 10 个产品,而 loop2 中是否有 15 个产品,要么先加载 10 个,要么先加载其他 15 个。但集合加载在一起。我想要做的是,来自loop1的一个产品,来自loop2的另一个产品等等。我说得通吗?:)
  • 哦,我明白了,最好的方法是只有 1 个部分...我会更新代码
【解决方案2】:

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

如果不了解您的数据结构,我无法为您提供更简洁的解决方案。

【讨论】:

  • 这两个循环都从两个不同的表中获取数据。将来 loop1 可以从表中获取更多数据,而 loop1 只能获取 1 或 2 列。那么更开放的解决方案是可能的吗?
  • 您需要添加有关您的应用程序和模型的更多信息。否则很难给你完美的答案。如果 loop1 和 loop2 的大小不同,您可以检查大小并使用较大的。
  • 我明白了。 @pablo89 的答案帮助了它。感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
相关资源
最近更新 更多