@sam さん、ありがとうございます!GET リクエストを見るだけでも、これはかなり直感的であることがわかります。2 ページ目を取得したい場合は、page という追加オプションを指定すればよいのです。また、discourse_api 関数で options を定義できることも確認できました。
# frozen_string_literal: true
module DiscourseApi
module API
module Search
# 指定された検索語に一致する検索結果を返します。
#
# @param term [String] 検索語
# @param options [Hash] カスタマイズ可能なオプションのセット
# @option options [String] :type_filter 指定されたタイプの結果を返します。
# @return [Array] 結果をハッシュの配列として返します。
def search(term, options = {})
raise ArgumentError.new("#{term} は必須ですが、指定されていません") unless term
raise ArgumentError.new("#{term} は必須ですが、指定されていません") unless !term.empty?
response = get('/search/query', options.merge(term: term))
response[:body]
end
end
end
end
そこで試してみたところ、1 ページ目と 2 ページ目で異なる結果が得られることを期待していました。あるいは、より明確に区別するために、1 ページ目と 3 ページ目で試してみましょう。クエリはすべての Q&A トピックを対象とします。
query = category["name"] + " #" + category["slug"]
=> "Q&A #q-a"
次に、discourse_api クライアントを使って 1 ページ目と 3 ページ目を取得します。
topics1 = client.search(query, options={"page": "1"})
topics3 = client.search(query, options={"page": "3"})
それぞれの最初のトピックを確認してみましょう。
=> {"id"=>220, "title"=>"Why am I exceeding the quota?", "fancy_title"=>"Why am I exceeding the quota?", "slug"=>"why-am-i-exceeding-the-quota", "posts_count"=>3, "reply_count"=>0, "highest_post_number"=>3, "image_url"=>nil, "created_at"=>"2018-06-01T12:56:12.120Z", "last_posted_at"=>"2018-06-15T16:41:44.736Z", "bumped"=>true, "bumped_at"=>"2018-06-15T16:41:44.736Z", "unseen"=>false, "pinned"=>false, "unpinned"=>nil, "visible"=>true, "closed"=>false, "archived"=>false, "bookmarked"=>nil, "liked"=>nil, "tags"=>["storage", "quota"], "category_id"=>26, "has_accepted_answer"=>false}
irb(main):148:0> topics3['topics'][0]
=> {"id"=>220, "title"=>"Why am I exceeding the quota?", "fancy_title"=>"Why am I exceeding the quota?", "slug"=>"why-am-i-exceeding-the-quota", "posts_count"=>3, "reply_count"=>0, "highest_post_number"=>3, "image_url"=>nil, "created_at"=>"2018-06-01T12:56:12.120Z", "last_posted_at"=>"2018-06-15T16:41:44.736Z", "bumped"=>true, "bumped_at"=>"2018-06-15T16:41:44.736Z", "unseen"=>false, "pinned"=>false, "unpinned"=>nil, "visible"=>true, "closed"=>false, "archived"=>false, "bookmarked"=>nil, "liked"=>nil, "tags"=>["storage", "quota"], "category_id"=>26, "has_accepted_answer"=>false}
これらは完全に同一です。つまり、page 変数が機能していないのではないかと思われます。Chrome の開発者ツールで確認すると、スクロールダウン(投稿がウィンドウ内で自動読み込みされるため)でトリガーされるポイントにおいて、page=2 が正しいパラメータであることが確認できます。
Request URL: https://ask.cyberinfrastructure.org/search?q=Q%26A%20%23q-a&page=2
Request Method: GET
Status Code: 200 (from ServiceWorker)
Referrer Policy: strict-origin-when-cross-origin
あるいは、パラメータリストを直接確認するのがより良いでしょう。
Query String Parameters
q: Q&A #q-a
page: 2
これはフォーム送信ではないため、例にあるような「Form Data」は表示されません。