※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
ソースコードを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
苦戦したところ
- 「articles」に代入すると思い込み、配列を作る発想がなかった
- 「qiita.rb」のファイルで「articles」について書くべきなのかがそもそも分からなかった
「each
」のコードで書いていたがすべての情報が出力されてしまい、タイトルと投稿者名だけ抜き出すことが出来ていなかった
ChatGPTにてヒントを得ようとしたとき、「map
」の使われたコードが返ってきた
ChatGPTが優秀すぎる
each
とmap
の使い方の違いを考えるため、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
以下の手順で実行します:
qiita.rb
とmain.rb
のファイルを作成します。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