Rubyのeachメソッドで複数の配列を回したいんだけど!
どうも、Linです。海鮮丼、仕入れました。
「Rubyで配列に入ってる変数を取り出して使いたい・・・!」
そんな時もたまにあるでしょう。
この時に便利なのがRubyのeachメソッドです。
たとえば、フルーツに関する次の配列があったとしましょう。
1 |
fruits = ['apple','banana', 'grape', 'orange'] |
このとき、fruitsの配列の中身を順番に表示させたいときは次のようなコードを書けばいいのですね。
1 2 3 4 5 6 7 |
fruits = ['apple','banana', 'grape', 'orange'] fruits.each |fruit| do print(fruit) end |
すると、出力結果は次のようになるはず。
apple
banana
grape
orange
このeachメソッドはRails開発でも頻繁に使います。
配列型のインスタンス変数から順番に変数を取り出してビューファイルに表示させるときなんかに活躍しますね。
そんなeachメソッドではなんと、
1つの配列だけじゃなくて複数の配列から同時に変数を取り出せる方法
というものが存在していたのです。
それは、
zipメソッド
を使う方法です。
具体的な使い方は、
1 2 3 |
1つ目の配列.zip(2つ目の配列) do |変数1, 変数2| end |
ですね。
たとえば、フルーツと野菜の配列があったとしましょう。
この配列から同時に野菜とフルーツの情報を取り出して、同時に表示させたいときは次のようなコードを書いていきますよ。
1 2 3 4 5 6 7 8 9 |
fruits = ['apple','banana', 'grape', 'orange'] vegetables = ['carrot','radish', 'leaf', 'letus'] fruits.zip(vegetables).each |fruit vegetable| do print(fruit) print(vegetble) end |
このコードの出力結果は次のようになるはずです。
apple
carrot
banana
radish
grape
leaf
orange
letus
Rails開発でeachメソッドで同時に配列を回す例
このeachのzipメソッドで複数の配列を同時に回すやり方はRails開発でももちろんいきてきます。
ぼくは必要に駆られて、あるウェブサイトから記事タイトルとURLを取り出して、さらにタイトルにリンクをつける、というRailsアプリを作ろうとしていました。
前回作成した「Railsのスクレイピングアプリ」ではタイトルだけスクレイピングしてきましたが、今回はそいつにaタグをつけてリンクまで付与しようとしたわけです。
このアプリを実現するためには、どうしても、
- タイトルの配列
- URLの配列
の2つを同時にeachで繰り返し展開させる必要があったのです。
ってことで、前回のスクレイピングアプリ(https://freesworder.netからタイトルを取得するアプリ)を改変して、タイトルにリンクをつけていきます。
まずは前回のスクレイピングアプリのtop_cotnroller.rbを次のように編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class TopController < ApplicationController def home agent = Mechanize.new page = agent.get("https://freesworder.net") @elements = page.search('.entry-title') @urls = page.search('.entry-title a') end end |
ここではページURLを格納するための@urlsというインスタンス変数を新たに定義しています。
searchメソッドで「クラス名がentry-titleで、その中にあるaタグ」の情報を取得して代入します。
続いて、記事タイトルとリンク先を表示するためのビューファイル(home.html.erb)を次のように編集します。
1 2 3 4 5 |
<% @elements.zip(@urls).each do|element, url|%> <a href="<%=url.get_attribute(:href)%>"><%= element.inner_text%></a><br> <%end%> |
注目したいのは次の2点。
- zipメソッドで複数の配列を同時ループ
- get_attributeメソッドでaタグ内の属性値hrefを取得
zipメソッドを使うことで、@elementsと@urlsという2つの配列を同じループで同時に取り出すことができているので、記事タイトルとそれに対応するリンクを同時に使用しています。
また、@urlsに代入した「クラス名がentry-titleで、その中にあるaタグ」の情報から「属性値hrefの情報」をget_attribution(:href)で取り出して、リンクのhref属性値に指定しています。
とまあこんな感じで、eachの繰り返しを複数の配列で同時進行できるzipメソッドはRails開発でも便利なので使ってみてくださいね。
それでは!
Lin
【参考URL】

おそらく、ブロガー。現在ホテル暮らしで全国フラフラしています。
ネット広告代理店に1年3ヶ月勤め上げ、独立をして丸4年が経ちました。今年でフリーランス 5年目。
質問・ご意見・相談があればLINEで受け付けていますのでお気軽にどうぞ 。
コメントを残す