【Rubyの基本】APIのソースコードをclass に書き換える

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

ソースコードをclassに書き換える

前回:QiitaのAPIを利用して記事検索のソースコードを書く

今回:前回書いたソースコード↓をclassに書き換える

# ↓はRubyで使えるクラスだが、読み込まないといけない
require 'uri'
require 'net/http'
require 'json'

# Qiitaの投稿情報を取得するAPIのurlを貼り付ける
url = "https://qiita.com/api/v2/items?query=Ruby"

# URIクラスを使用する
uri = URI.parse(url)

# urlにアクセスする
res = Net::HTTP.get(uri)

# 文字列から配列に書き換える
res = JSON.parse(res)

# # 情報にアクセスして配列で受け取ることが出来る
# puts res

# 「タイトル by ユーザー名」の形ですべて返ってくる
res.each do |item|
  puts "#{item['title']} by #{item['user']['name']}"
end

実行したいコードを確認

デイトラ初級編、最終課題

require_relative('./qiita')

qiita = Qiita.new('Ruby')
articles = qiita.search()
puts articles

まず何を定義するか、何が必要か考える

  • 「qiita」ファイルに、「Qiita」クラスを作成する
  • 「search」したあと、「articles」という配列を作成する
  • 「articles(検索結果)」をputsする

なんとか出来上がったコード

require 'uri'
require 'net/http'
require 'json'

class Qiita
   attr_accessor :query

   def initialize(query)
      @query = query
   end

   def search
      # Qiitaの投稿情報を取得するAPIのurlを貼り付ける
      url = "https://qiita.com/api/v2/items?query=#{@query}"
      # URIクラスを使用する
      uri = URI.parse(url)
      # urlにアクセスする
      res = Net::HTTP.get(uri)
      # 文字列から配列に書き換える
      res = JSON.parse(res)
      # 記事のタイトルと投稿者名を抜き出して配列を作り直す
      res.map do |article|
        "#{article['title']} by #{article['user']['name']}"
      end
   end
end

苦戦したところ

「search」した結果を「articles」に代入?

  • 「articles」に代入すると思い込み、配列を作る発想がなかった
  • 「qiita.rb」のファイルで「articles」について書くべきなのかがそもそも分からなかった

「each」と「map」

each」のコードで書いていたがすべての情報が出力されてしまい、タイトルと投稿者名だけ抜き出すことが出来ていなかった

ChatGPTにてヒントを得ようとしたとき、「map」の使われたコードが返ってきた


ChatGPTが優秀すぎる

eachmapの使い方の違いを考えるため、chatGPTの作成したコードを見比べてみた

ひとつのファイルにコードを書く場合

以下は、Qiita APIを使用して記事を検索し、記事のタイトルと投稿者名を取得するRubyのクラスです。

require 'uri'
require 'net/http'
require 'json'

class Qiita
  attr_accessor :query

  def initialize(query)
    @query = query
  end

  def search
    # Qiitaの投稿情報を取得するAPIのURLを生成
    url = "https://qiita.com/api/v2/items?query=#{@query}"
    # URIクラスを使用してURLを解析
    uri = URI.parse(url)
    # URLにアクセスしてレスポンスを取得
    res = Net::HTTP.get(uri)
    # 文字列から配列にパースする
    res = JSON.parse(res)
    # 記事のタイトルと投稿者名を出力する
    res.each do |item|
      puts "#{item['title']} by #{item['user']['name']}"
      puts "\n"
    end
  end
end

# 例として 'Ruby' をクエリに検索する場合
qiita = Qiita.new('Ruby')
qiita.search

クラスのインスタンスを作成し、search メソッドを呼び出すことで、指定されたクエリに基づいたQiitaの記事タイトルと投稿者名が出力されます。

「articles」という配列を作らないため、「each」が使われている


ふたつのファイルでコードを書く場合

chatGPTに投げてみた

# main.rb

require_relative './qiita'

qiita = Qiita.new('Ruby')
articles = qiita.search
puts articles

Qiita クラスを定義し、それを別のファイルから呼び出すためのスクリプト例を以下に示します。

まず、qiita.rbというファイルにQiitaクラスを定義します。

# qiita.rb

require 'uri'
require 'net/http'
require 'json'

class Qiita
  attr_accessor :query

  def initialize(query)
    @query = query
  end

  def search
    # Qiitaの投稿情報を取得するAPIのURLを生成
    url = "https://qiita.com/api/v2/items?query=#{@query}"
    # URIクラスを使用してURLを解析
    uri = URI.parse(url)
    # URLにアクセスしてレスポンスを取得
    res = Net::HTTP.get(uri)
    # 文字列から配列にパースする
    res = JSON.parse(res)
    # 記事のタイトルと投稿者名を配列に格納する
    articles = res.map do |item|
      "#{item['title']} by #{item['user']['name']}"
    end
    articles
  end
end

以下の手順で実行します:

  1. qiita.rbmain.rb のファイルを作成します。
  2. main.rb ファイルを実行します。

これにより、指定されたクエリ(この場合は “Ruby”)に基づいてQiitaの記事情報が取得され、各記事のタイトルと投稿者名が表示されます。

修正したsearchメソッドは、取得した記事情報を配列として返すようになっているため、main.rbでその配列を出力することができます。


「articles」という配列が作られているため、「map」により新たな配列に作りかえる


模範解答のコード

デイトラ講師の先生が作成した模範解答コード

require 'uri'
require 'net/http'
require 'json'

class Qiita
   attr_reader:url

   def initialize(query)
      # Qiitaの投稿情報を取得するAPIのurlを貼り付ける
      @url = "https://qiita.com/api/v2/items?query=#{query}"
   end

   def search
      # URIクラスを使用する
      uri = URI.parse(url)
      # urlにアクセスする
      res = Net::HTTP.get(uri)
      # 文字列から配列に書き換える
      res = JSON.parse(res)
      # 記事のタイトルと投稿者名を抜き出して配列を作り直す
      res.map do |article|
        "#{article['title']} by #{article['user']['name']}"
      end
   end
end

回りくどく書かなくてもすっきり書ける↓

 # ↓のように書かなくても 
   def initialize(query)
    @query = query
   end

 # ↓のように書けばすっきりする
   def initialize(query)
      # Qiitaの投稿情報を取得するAPIのurlを貼り付ける
      @url = "https://qiita.com/api/v2/items?query=#{query}"
   end

#DAY30