带有分页功能的Google自定义搜索API

时间:2011-06-22 04:03:24

标签: 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宝石进行分页。

我希望当用户点击指向其他网页的链接时,我会从Google的API中获取接下来的10个结果。您可以使用API​​的start参数来指定首先开始的结果,我将其作为i传递。我在考虑做这样的事情:

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

其中params[:page]是当前页码,但由于某种原因未定义。另外,我不确定如何为不是AR对象的数组设置分页,以及我认为的内容。我很感激任何帮助,并随意使用你知道的任何分页宝石。

1 个答案:

答案 0 :(得分:0)

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

也许你需要在控制器中使用这样的东西:

@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的方式。