在两个部分之间分配循环的返回

时间:2014-01-23 14:23:07

标签: ruby sinatra haml

我基本上有这两个模板:

<article>
  <section>
    ...
  </section>
  <section>
    ...
  </section>
</article>

@posts.each do |post|
  <h3> post.title </h3>
  <p> post.body </p>
  <hr />

我可以使用...替换<section>中的yield并填写此部分中的每个帖子。现在我想做的是每回合交替一次,这样两个部分中的每一部分都被平等地填满。我敢肯定必须有一些相对简单的方法来实现这一目标吗?我现在想不出一个。

编辑:不要误会我的意思。第一个模板可以(也可能应该)与第二个模板合并。

1 个答案:

答案 0 :(得分:1)

在第一部分中执行此操作:

@posts.select.each_with_index{|_,i| i.even? }

这是另一个:

@posts.select.each_with_index{|_,i| i.odd? }

如果你不介意这些元素不是在列之间交替而是从上到下,你可以这样做:

<article>
  <% @posts.in_groups(2, false) do |grouped_posts| %>
  <section>
    <% grouped_posts.each do |post| %>
    <h3> post.title </h3>
    <p> post.body </p>
    <hr />
    <% end %>
  </section>
  <% end %>
</article>

在Rails之外,您可以从活动支持gem中提取in_groups的必要位

require 'active_support/core_ext/array/grouping'

或者您可以使用这种非常类似的替代方法:

@posts.each_slice((@posts.size/2.0).ceil).to_a

唯一的区别是:

@posts = []

@posts.in_groups(2, false)                         #=> [[], []]
@posts.each_slice((@posts.size/2.0).ceil).to_a     #=> []