【问题标题】:How to see paging results with Sequel and Sinatra如何使用 Sequel 和 Sinatra 查看分页结果
【发布时间】:2013-06-01 20:37:47
【问题描述】:

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

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

Ruby 代码是:

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 页。

【问题讨论】:

    标签: ruby sinatra will-paginate sequel


    【解决方案1】:

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

    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
    

    如果没有给出它们,我会为两者添加默认值。我了解you can do this via the library,例如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 %>
    

    因此,从what I can see 开始,Sequel paginate 方法不会被覆盖或包装/重载,因此its method signature 与您仅使用 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 的 paginate 获得什么优势。我找不到让 Sinatra 助手工作的方法。

    【讨论】:

    • 非常感谢您的建议。不幸的是,它不起作用,错误消息是:ArgumentError at /candidate 参数数量错误(1 对 2)文件:pagination.rb 位置:分页行:26 我以前在各种实验中都遇到过这个问题,我只是想不通.
    • @user1903663 不幸的是,该文件中只有 25 行!取出.extension(:pagination),不需要,看看有没有帮助。例如@items = DB[:candidates].order(:id).paginate(:page =&gt; page, :per_page =&gt; per_page).
    • 很抱歉让我很痛苦,但仍然没有好处。这一次,错误是:错误的参数数量(1 对 2)文件:pagination.rb - 实际上是相同的错误消息。位置:分页行:26
    • @user1903663 将您的 Ruby、Sequel、Sinatra 和 will_paginate 版本添加到问题中,我会看看是否可以重新创建它。
    • @user1903663 我也注意到了这个问题,我在答案的编辑中添加了它。
    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2015-01-29
    • 2013-12-03
    • 1970-01-01
    • 2013-10-04
    • 2013-12-31
    • 2013-12-01
    相关资源
    最近更新 更多