我有一个带有两个< ul>的布局,这些布局是浮动的,我想在每个ul中有一些甚至数量的项目。
所以,我想把我的收藏分成两半,在第一个中有一半,在另一个中有一个......
最初我开始思考,好吧我可以看到我的观点:
<ul>
@collection[0..(@collection.to_f / 2).ceil].each do
<li> ... </li>
end
</ul>
<ul>
@collection[(@collection.to_f / 2).ceil..-1].each do
<li> ... </li>
end
</ul>
但这很没有吸引力。所以我开始考虑写一个助手来做那个,但后来我最终只是在我的模型中制作了范围:
scope :first_half, {:limit => (count.to_f / 2).ceil}
scope :last_half, {:offset => (count.to_f / 2).ceil}
<ul>
Collection.first_half.each do
<li> ... </li>
end
</ul>
<ul>
Collection.last_half..each do
<li> ... </li>
end
</ul>
但我觉得这可能不太理想,因为视图是唯一引用这些范围的东西?
答案 0 :(得分:4)
一个月前我完成了同样的事情。我写了一个惊人的扩展Enumerable
,以便能够将集合分成N组,然后实现了ActiveSupport已经提供了(几乎)。
看看in_groups(number, fill_with = nil)
它会将数组拆分成数字组,非常适合视图:)
答案 1 :(得分:1)
最好做点什么:
Collection.each_slice(Collection.length / 2) { |half|
<ul>
half.each do
<li> ... </li>
end
</ul>
}
当然,如果您的收藏中有奇数个条目,那么最终会有3个列表。
答案 2 :(得分:1)
我同意您应该定义视图助手而不是模型的范围。如果定义视图助手而不是内联编写,则可以使语法更好。
# collection_helper.rb
def first_half(collection)
collection[0..(collection.to_f / 2).ceil]
end
# index.html.erb
<ul>
first_half(@collection).each do
<li> ... </li>
end
</ul>