我有一个由我的控制器加载的城市列表@cities = City.order :name
。
并在我的视图中显示复选框:
f.collection_check_boxes :cities_ids, @cities, :id, :name
每个复选框都包裹在一个 33% 宽的 div 中,它们的输出排列如下:
city_A | city_B | city_C
city_D | city_E | city_F
city_G | city_H | city_I
city_J | |
我试图@cities
在将其传递给构建器之前对其进行排序,因此它可以在 3 列上垂直对齐:
city_A | city_E | city_H
city_B | city_F | city_I
city_C | city_G | city_J
city_D | |
在尝试了不同的组合Enumerable
和Array
方法(以及流鼻血和 2 阿司匹林)后,我决定问你们。谢谢!
临时解决方案
通过写一个助手我可以解决这个问题,如果你们能想出一个更好更紧凑的解决方案,我将不胜感激。看一下这个
def per_column(records, number_of_columns = 3)
collection = records.dup
result = []
return collection if records.count <= number_of_columns
# Build columns
number_of_columns.times do |column_index|
number_of_items = (collection.count.to_f / (number_of_columns - column_index)).ceil
result << collection.slice!(0, number_of_items)
end
# Ensure each columns has same number of lines
result.each {|column| column << nil until column.count == result[0].count }
# Transpose
result.transpose.flatten.compact
end
然后我就打电话
f.collection_check_boxes :cities_ids, per_column(@cities), :id, :name
似乎适用于任意数量的记录。再一次,如果您能指出我更优雅的解决方案,我将不胜感激