我正在尝试将一个包含七列的表放在一起来制定计划。在每列我想列出二十个字段。我在玩,但我找不到让它工作的方法。
控制器:
def new
@doctor = Doctor.new
140.times { @doctor.schedules.build }
end
型号:
has_many :schedules
def schedule_attributes=(schedule_attributes)
schedule_attributes.each do |attributes|
schedules.build(attributes)
end
end
形式:
<tr>
<% @doctor.schedules.each_with_index do |schedule, i| %>
<td>
<% if i > 0 && i % 20 == 0 %>
</td>
<td>
<% end %>
<%= fields_for "doctor[schedule_attributes][]", schedule do |schedule_form| %>
<ul>
<% schedule_form.text_field :day, value: @days[0] %>
<li><%= schedule_form.check_box :hour, value: "8:00" %></li>
</ul>
<% end %>
</td>
<% end %>
</tr>
这只输出四十个字段。这个想法输出140个字段,每列20个。
我想在一个单元格中插入二十个字段。有人能指出我正确的方向吗?
答案 0 :(得分:0)
使用简单(快速和脏)的方法,您可以这样做:
<tr>
<td>
<% @doctor.schedules.limit(140).each_with_index do |schedule, i| %>
<% if i > 0 && i % 20 == 0 %>
</td>
<td>
<% end %>
<%= fields_for "doctor[schedule_attributes][]", schedule do |schedule_form| %>
<ul>
<% schedule_form.text_field :day, value: @days[0] %>
<li><%= schedule_form.check_box :hour, value: "8:00" %></li>
</ul>
<% end %>
<% end %>
</td>
</tr>
如果要重用此逻辑,则应使用辅助方法:
def to_columns(collection, num_columns)
html = ""
count = collection.size
num_rows = (count / num_columns.to_f).ceil
collection.each_with_index do |item, i|
html << '<td>'.html_safe if (i % num_rows == 0)
html << yield(item, i)
html << '</td>'.html_safe if (i % num_rows == 0 || i == (count - 1))
end
html
end
在您看来,请使用此方法根据需要制作<td>
代码:
<tr>
<%= to_columns(@doctor.schedules.limit(140), 7) do |schedule, i| %>
<%= fields_for "doctor[schedule_attributes][]", schedule do |schedule_form| %>
<ul>
<% schedule_form.text_field :day, value: @days[0] %>
<li><%= schedule_form.check_box :hour, value: "8:00" %></li>
</ul>
<% end %>
<% end %>
</tr>