这是对MVC的不当使用吗?

时间:2011-08-08 20:37:07

标签: ruby-on-rails ruby-on-rails-3

我有一个带有两个< 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>

但我觉得这可能不太理想,因为视图是唯一引用这些范围的东西?

3 个答案:

答案 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>