ruby-on-rails - 带分页功能的 Google 自定义搜索 API

标签 ruby-on-rails ruby ruby-on-rails-3 pagination

我有这个方法将来自 Google 自定义搜索 API 的 10 个结果的链接放入一个数组中:

require 'json'
require 'open-uri'

def create
    search = params[:search][:search]
    base_url = "https://www.googleapis.com/customsearch/v1?"

    stream = open("#{base_url}key=XXXXXXXXXXXXX&cx=XXXXXXXXXX&q=#{search}&start=#{i}&alt=json")
    raise 'web service error' if (stream.status.first != '200')

    result = JSON.parse(stream.read)

    @new = []
    result['items'].each do |r|
      @new << r['link']
    end
end

我的观点:

<% @new.each do |link| %>
    <p><%= link %></p>
<% end %>

我无法弄清楚如何为此添加分页,以便在第二页上返回接下来的 10 个结果。我正在使用 Kaminari gem 进行分页。

我想当用户点击指向另一个页面的链接时,我从 Google 的 API 获取接下来的 10 个结果。您可以使用 API 的 start 参数执行此操作,该参数指定要开始的第一个结果,我将其作为 i 传递。我正在考虑做这样的事情:

i = (params[:page] - 1) * 10 + 1

其中 params[:page] 是当前页码,但由于某些原因未定义。此外,我不确定如何为不是 AR 对象的数组设置分页,以及在我看来会发生什么。我将不胜感激任何帮助,并随时使用您知道的任何分页 gem。

最佳答案

你如何设置params[page]?它需要以某种方式与您请求中的其他参数一起传递。

也许您的 Controller 中需要这样的东西:

@page = params[:page] || 1
i = (@page - 1) * PER_PAGE + 1

stream = open("#{base_url}key=XXXXXXXXXXXXX&cx=XXXXXXXXXX&q=#{search}&start=#{i}&alt=json")
raise 'web service error' if (stream.status.first != '200')

result = JSON.parse(stream.read)
@new = result['items'].map{|r| r['link']}

在您看来,您需要确保通过链接中的查询参数传递页面以获取下一组结果。您很可能想要返回 @page + 1

处理非 ActiveRecord 对象的分页取决于您的分页库。您可能想查看如何 will_paginate handles this .

关于ruby-on-rails - 带分页功能的 Google 自定义搜索 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6434763/

相关文章:

mysql - Rails find_by 与 OR

ruby-on-rails - 销毁后不被要求销毁协会?

ruby-on-rails - config.paths.log 中未定义 log 方法

ruby - 如何让 Ruby 方法显示它们期望的类型

ruby-on-rails - 使用 authlogic rails 插件在数据库中预填充管理员用户

ruby - 如何指向哈希中的深层嵌套元素?

ruby-on-rails - 瘦服务器性能不佳/事件化的Web服务器如何工作?

ruby-on-rails - 我们无法运行 "Project Status"或 "Requirement Coverage"报告(模块失败)

ruby-on-rails - 处理后台作业的 Ruby RSpec 最佳实践是什么?我正在做一些不必要的复杂事情吗?

ruby-on-rails - 如何从引擎覆盖 Rails 应用程序路由?