Ruby / Rails - 为可变数量的单元格动态创建表格

时间:2011-06-29 21:27:15

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

我正试图以表格的形式在我的模型中显示对象,但是我很难动态地创建行和列。

我有一个名为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>

所以问题实际上与如何在视图中分解这类数据有关。

5 个答案:

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

以下是该方法的文档:http://apidock.com/rails/Array/in_groups_of