🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1209閲覧

リクエストしたAPIのアイテムを全件取得したい

ik_ko

総合スコア9

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/03/14 04:17

現在Webエンジニア転職のためポートフォリオ作成中のところ、コード記述で躓いたのでご教授お願いします!

起きている問題

楽天APIを用いて、指定したshopのアイテムをページネージョン機能を加えて、全て表示させたい。
コントローラーのAPI取得部分で時間がかかり過ぎのため、エラーまたはずっとロード時間が続いているので別のコードの書き方をご教授して頂きたい。
2,

ソースコード、ログ

rakuten.rb

class RakutensController < ApplicationController def index read = 1 while read = 13 @items = RakutenWebService::Ichiba::Item.search(shopCode: 'shop-senjin', page: read) @senjins = [] @items.each do |item| @senjins.push(item) end read = read + 1 end @senjins = Kaminari.paginate_array(@senjins).page(params[:page]).per(30) end

shop-sinjinのjson結果

], "pageCount": 12, "TagInformation": [], "hits": 30, "last": 30, "count": 357, "page": 1, "carrier": 0, "GenreInformation": [], "first": 1 }

コード説明

楽天のshop-senjinのアイテムを取得し、ページネーション機能を追加するためページネージョンのメソッドを使ったがRakutenWebServiceクラスだったためエラーが起きたのでRakutenWebServiceクラスからarrayクラスにメソッドに変換しました。
一回のリクエストにつき、30件のアイテムしか取得できないため、13回行えば、357件のアイテムを取得できると思い上記の記述で試しましたが、処理が重くなってしまっています。

問題解決するために試したこと

楽天APIの公式ページにも
※短い時間の間に大量に、同一のリクエストURLへアクセスすると、一定時間利用できなくなる場合がございます。テストの際にはご注意ください。
書いているため全件の取得は難しいかなとも思っていますがコードの書き方が悪いなら改善できるコードの書き方をご教授頂きたいです。

問題について考えたこと(デバッグ結果)

SPA化するのがおそらく最善の解決方法ではあるのかなと思いますが今からだと工数が多くかかってしまうため違うコードの記述方があれば教えて頂きたいです。
データ量が多く、重くなっているなら必要な値だけ、レスポンスとして返ってくる方法があれば少しは軽くなって動作するのではと考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

paginateのために全件取得しようとするのが良くないです。
APIからは表示に必要なデータだけ取得し、paginate の表示を状態に合わせます。

ruby

1PER = 30 2 3def index 4 @items = RakutenWebService::Ichiba::Item.search(shopCode: 'shop-senjin', page: parmas[:page], hits: PER) 5 # ページ数 6 @total_pages = items.response.page_count 7 # 商品数 8 @total_count = items.response.count 9 # 空の配列で構わない 10 @dummy = Kaminari.paginate_array([]).page(params[:page]) 11end

erb

1<% @items.response.each do |item| %> 2 name: <%= item["productName"] %> 3 price: <%= item["minPrice"] %> 4<% end %> 5 6count: <%= @total_count %> 7.pagination 8 <%= paginage @dummy, total_pages: @total_pages %>

投稿2021/03/14 21:56

neko_daisuki

総合スコア2090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ik_ko

2021/03/15 14:09

ありがとうございます! 無事に動きました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問