我正试图以表格的形式在我的模型中显示对象,但是我很难动态地创建行和列。
我有一个名为Pictures的模型,目前我在looooong列表中显示所有这些模型。
<% for picture in @pictures %>
<p><%= image_tag(picture.url) %></p>
<% end %>
如何使用rails将其转换为视图中的表?
<table>
<tr>
<% for picture in @pictures %>
<td>
<%= image_tag(picture.url) %>
</td>
** Here's where I'm confused..How can I write after 6 cells create a new row?? *****
<% end %>
</table>
所以问题实际上与如何在视图中分解这类数据有关。
答案 0 :(得分:11)
查看可枚举的方法“.each_slice”。
http://www.ruby-doc.org/core/classes/Enumerable.html#M001514
有了它,你可以做一些事情:
<table>
<% @pictures.each_slice(6) do |slice| %>
<tr>
<% slice.each do |picture| %>
<td>
<%= image_tag(picture.url) %>
</td>
<% end %>
</tr>
<% end %>
</table>
你可能需要做一些摆弄才能很好地填充最后一行,但这样可以让你顺利进行。
答案 1 :(得分:1)
我真的在挖掘each_slice解决方案。我想如果你想要一个非表格式的视图我就会想到你,你可以找到你的图像的最大宽度和最大高度,并在你的照片周围设置一个容器,然后用css将它们全部浮动起来。每行都包含许多适合你的包含div。
视图
<% for picture in @pictures %>
<div class="photo">
<%= image_tag(picture.url) %>
</div>
<div class="float_clear"></div>
<% end %>
CSS
.photo {height: 150px; width: 150px; float:left;margin:0 10px; 10px 0;}
.photo img{max-height: 150px; max-width: 150px;}
.float_clear{clear:both;}
答案 2 :(得分:0)
我确信ruby on rails有一些帮助 - 但如果没有,这就是我过去生活中作为一个低级php开发人员接触这种布局的方式:
保持计数,模6(即i =(i + 1)%6)。如果i == 0,则输出&lt; tr&gt;&lt; / tr&gt;。
所以,比如:
<% i = 0 %>
<tr>
<%
@pictures.each do |picture|
i = (i + 1) % 6
%>
<%= '<tr></tr>' if i == 0 %>
<td>
<%= image_tag(picture.url) %>
</td>
<% end %>
</tr>
答案 3 :(得分:0)
我会使用%(模数),如下所示:
<table>
<% rows = 0 %>
<% @pictures.each do |picture| %>
<%= "<tr>" if rows % 6 %>
<td><%= image_tag(picture.url) %></td>
<% rows += 1 %>
<%= "</tr>" if rows % 6 %>
<% end %>
<%= "</tr>" unless rows % 6 %>
</table>
答案 4 :(得分:0)
在rails中执行此操作的另一个好方法是使用方法in_groups_of
。
所以你可以拥有
<table>
<% @pictures.in_groups_of(6, false) do |group| %>
<tr>
<% group.each do |picture| %>
<td>
<%= image_tag(picture.url) %>
</td>
<% end %>
</tr>
<% end %>
</table>