如何实施与sinatra的分页?

时间:2012-12-03 18:27:49

标签: ruby pagination sinatra

我正在使用Sinatra和Ruby 1.9.3。

我有一个项目列表,想要对它们进行分页。我是网络开发的新手,所以我不知道如何详细地做到这一点。

我不知道如何为每个网页实施链接,例如page2page1的链接。我应该这样做:

<a href='?page=2'

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

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

如何实现具有以下功能的分页:

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

3 个答案:

答案 0 :(得分:4)

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

@page = params[:page] || 1

然后像你一样使用它:

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

答案 1 :(得分:1)

还有一个名为will_paginate的流行宝石,它会自动为您完成一些这样的工作:https://github.com/mislav/will_paginate。与Sinatra合作。

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

答案 2 :(得分:0)

你可以这样做,在@ 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