1

我正在使用will_paginate并尝试从 Sequel 中分页数据集。要求是:

require 'will_paginate'
require 'will_paginate/sequel'
require 'will_paginate/collection'
require 'will_paginate/version'
require 'sequel/extensions/pagination'

红宝石代码是:

get '/candidate' do
     @items = DB[:candidates].order(:id).extension(:pagination).paginate(1, 10)
     erb :candidate
end

在视图中:<%= will_paginate @items %>

数据集正确呈现 10 条记录,当我单击“2”或“下一步”时,浏览器中的地址更改为http://localhost:4567/candidate?page=2但记录保持不变。实际上,结果没有分页,我无法超过第 1 页。

4

1 回答 1

1

页数和记录数在您的示例中使用 硬编码paginate(1, 10),因此它始终会带回第 1 页的 10 条记录。您需要page=2从查询字符串传递参数。这是通过params助手完成的:

get '/candidate' do
  @items = DB[:candidates].order(:id).paginate(:page => params["page"].to_i, :per_page => 10)
  erb :candidate
end

如果您愿意,您还可以通过添加以下代码来传递per_page查询字符串中的 :

get '/candidate' do
   @items = DB[:candidates].order(:id).paginate(:page => params["page"].to_i, :per_page => params["per_page"].to_i)
   erb :candidate
end

如果没有给出它们,我会为两者添加默认值。我知道你可以通过图书馆来做到这一点,例如WillPaginate.per_page = 10,但你也可以在路线中做到这一点,通过:

get '/candidate' do
  page = params.fetch "page", 1
  per_page = params.fetch "per_page", 10
  @items = DB[:candidates].order(:id).paginate(:page => page.to_i, :per_page => per_page.to_i)
  erb :candidate
end

在您还使用 will_paginate 提供的 Sinatra 助手之前,我没有注意到。

我要么调用paginate数据集,要么获取一个未分页的数据集,然后将其传递给助手。所以要么这样:

get '/candidate' do
  page = params.fetch "page", 1
  per_page = params.fetch "per_page", 10
  @items = DB[:candidates].order(:id).paginate(:page => page.to_i, :per_page => per_page.to_i)
  erb :candidate
end

# in the view
<%= @items %>

或这个:

get '/candidate' do
  @items = DB[:candidates].order(:id)
  erb :candidate
end

# in the view
<%= will_paginate @items, params %>

因此,据所知,Sequelpaginate方法没有被覆盖或包装/重载,因此它的方法签名与您仅使用 Sequel 而不是 will_paginate 时的方法签名相同。这意味着这段代码对我有用:

require 'will_paginate'
require 'will_paginate/sequel'
get '/candidate' do
  page = params.fetch "page", 1
  per_page = params.fetch "per_page", 10
  @items = Repo.db[:candidates].order(:id).paginate(page.to_i, per_page.to_i)
  haml :candidate
end

在 Haml 视图中:

- @items.each do |i|
  = i[:title]

由于方法签名是相同的,我不确定使用 will_paginate 比使用 Sequel 的分页获得什么优势。我找不到让 Sinatra 助手工作的方法。

于 2013-06-06T02:58:06.487 回答