Edited at

each_sliceメソッドの使い方

この記事では、Rubyのeach_sliceメソッドを用いて、配列をある要素ごとに分割する方法を紹介します。


配列を要素ごとに2分割する方法について


posts_controller.rb


class PostsController < ApplicationController
def index
@posts = ["post1", "post2","post3","post4", ・・,"post10"]
end
end


index.html.erb

<% @post.each_slice(2) do |post1,post2| %>

<hr>
<%= post1.id %>
<div class = "content">
<%= post2.id %>
</div>

<% end %>


上記のコードにより、下記のようになります。

b724f33af51cdcc8bffb43acfc973ac3.png


配列の要素ごとに3分割する方法について


index.html.erb

<% @posts.each_slice(3) do |post1,post2,post3| %>

<hr>
<%= post1.id %>
<%= post2.id %>
<%= post3.id %>
<% end %>

しかし、上記のように実行すると、ブラウザには下の画像の通り、NoMethodエラーが起きてしまいます。

c95c83f1dbe64d6128c9eb00ec2c8d40.png

エラー画面の<%= post2.id %> のところにnilが入っていますと書かれています。

その原因として、each.slice(3)の場合、ブロック引数に示したpost1,post2,post3に@postから受け取った数字が1ループあたり3つずつ入ります。10は3では割り切れないため、最後のブロック引数の値の2つがnilとなってしまいます。

| 1,2,3 | 4,5,6 | 7,8,9 | 10,nil, nil | となり、引数にnilが含まれていたのでエラーが起きてしまいました。

そこで下記のコードのように、各要素に <% if post(x) != nil%>を付け加えます。

このようにすることで、引数にnilが入った場合は実行しないという動作を実現できます。


index.html.erb

<% @posts.each_slice(3) do |post1,post2,post3| %>

<hr>

<% if post1 != nil%>
<%= post1.id %>
<% end %>

<% if post2 != nil %>
<%= post2.id %>
<% end %>

<% if post3 != nil%>
<%= post3.id %>
<% end %>
<% end %>


ブラウザでの動作は下の画像の通りになります。

5a7e2623db86fac9f54727889b30e99f.png


まとめ

この記事では、配列を要素ごとに分割するRubyの便利なメソッドについて紹介しました。