やりたいこと
レコードの一覧を(やむなく)テーブルレイアウトで表示したい
悩むところ
レコードの数は可変なので、レコード数で素直にテーブルレイアウトを実現しようとすると列数が半端な場合がでてきてしまう。
解決方法
ActiveSupportで追加されるArray#in_groups_of
を使う。
in_groups_of
を使うと、配列を指定の列数で区切った2次元の表にしてくれ、且つ最終行で列数に満たない部分にはnil
を入れてくれます。
%w(1 2 3 4 5 6 7 8 9 10).in_groups_of(3) {|group| p group}
["1", "2", "3"]
["4", "5", "6"]
["7", "8", "9"]
["10", nil, nil]
入れるものを指定することも。
%w(1 2 3 4 5).in_groups_of(2, ' ') {|group| p group}
["1", "2"]
["3", "4"]
["5", " "]
これをレコードのコレクションに対して適用してあげれば、
<table>
<% Post.all.in_groups_of(3) do |row| %>
<tr>
<% row.each do |post| %>
<td>
<% if post %>
<%=link_to post.title, post %>
<% end %>
</td>
<% end %>
</tr>
<% end %>
</table>
以下のような感じで奇麗なテーブルレイアウトを実現できるのであった。
参考: