【问题标题】:how to implement pagination with sinatra?如何使用 sinatra 实现分页?
【发布时间】:2015-01-21 11:28:18
【问题描述】:

我正在使用 Sinatra 和 Ruby 1.9.3。

我有一个项目列表,并且想要对它们进行分页。我是 Web 开发的新手,所以我不知道如何详细操作。

我不知道如何实现每个页面的链接,例如page1上的page2的链接。我应该这样做吗:

<a href='?page=2'

我认为这不是一个好主意,因为它会覆盖我的其他参数,例如 ?searchterm= 和 ?sort=?,并且不会考虑现有的 ?page= 参数。

我的想法是使用与searchterm 等相同的表单,并通过按钮和 JavaScript 更改值。但是,这似乎相当复杂,所有大型网站,包括 stackoverflow.com,都使用链接进行分页。

我如何实现具有以下特点的分页:

  1. 转到另一个页面时包含其他参数。
  2. 覆盖现有的?page= 参数。
  3. 没有 Javascript(可选,但会很好)。

【问题讨论】:

  • 这不是一个容易回答的问题,因为我们对您的系统了解不够。您是否在数据库中拥有庞大的数据集,或者在代码或文件中拥有少量数据集?您的数据库和 HTML/Sinatra 主机之间有什么样的响应时间?您希望浏览器和用户一次访问所有数据还是少量访问?
  • 你是对的,问题并不完美:/
  • 这是您在不同语言和应用程序前端以及使用不同数据时会一次又一次遇到的事情之一。我已经在我的数据库查询和 JavaScript 中处理了分页。这仅取决于我是想避免将数千行数据转储到浏览器还是让用户受苦。
  • 我需要保存带宽,还需要按创建时间对项目进行分组。我请求所有与 searchtern 匹配的项目,然后在我的控制器中对其进行排序。我需要节省带宽!
  • 那么任何答案都需要在数据库中进行分页,这很容易使用limit 或者offset,具体取决于DBM。在您的 SQL 查询中进行分组和排序,因为 DBM 已针对它进行了优化。你没有说你用于 ORM 的数据库连接,但它们都支持这些东西。

标签: ruby pagination sinatra


【解决方案1】:

您始终可以将必要的参数加载到实例变量中:

@page = params[:page] || 1

然后像以前一样使用它:

<a href="?page=#{@page + 1}&search_term=#{params[:searchterm]}"...

【讨论】:

  • 非常感谢,为什么我不知道我可以使用 params[] 哈希? :D
【解决方案2】:

您可以这样做,在@ChuckE 的回答中添加一点:

# Controller
  def index
    # ...
    @models = MyModel.find(:yourquery)
    if params[:page]
      page = params[:page].to_i
      @models = @models[(page * 10)..(page + 10)] # Selecting an slice out of the @models array
    end
  end

# In your view
  - @model.each do |item|
    =# do stuff
  = link_to "Next Page", "?page=#{@page + 1}"
  = link_to "Next Page", "?page=#{@page - 1}" unless @page = 1

【讨论】:

  • 谢谢,但第一个答案涵盖了第 1 点,保留现有参数 ;)
  • [(page * 10)..(page + 10)] 部分似乎不正确。 page = 1 给 [10..11], page = 2 - [20..12]
【解决方案3】:

还有一个很受欢迎的 gem,叫做 will_paginate,它会自动为你做一些这样的事情:https://github.com/mislav/will_paginate。与辛纳屈合作。

## Sinatra app:
require 'will_paginate'
require 'will_paginate/active_record'  # or data_mapper/sequel

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 2014-08-10
    • 2020-02-04
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多