2012-12-03 66 views
1

我使用Sinatra和Ruby 1.9.3。如何實現與sinatra的分頁?

我有一個項目列表,並希望分頁。我是網絡開發的新手,所以我不知道如何詳細說明。

我不知道如何實現每個頁面的鏈接,例如鏈接到page2page1。我應該做的,像這樣:

<a href='?page=2' 

我不認爲這是一個好主意,因爲它會覆蓋我的其他參數,如?searchterm=?sort=?,它不會利用現有?page=參數考慮在內。

我的想法是使用與我的searchterm等相同的表格,並通過按鈕和JavaScript更改值。但是,這似乎相當複雜,包括stackoverflow.com在內的所有大型網站都使用鏈接進行分頁。

如何實現分頁其特點如下:

  1. 轉到另一個頁面時包括其他參數。
  2. 覆蓋現有的?page=參數。
  3. 沒有Javascript(可選,但會很好)。
+0

這不是一個容易回答的問題,因爲我們對系統不夠了解。你在數據庫中有一個巨大的數據集還是在代碼或文件中有一個小集?你的數據庫和你的HTML/Sinatra主機之間有什麼樣的響應時間?你想讓瀏覽器和用戶一次或少量訪問所有數據嗎? –

+0

你是對的,這個問題並不完美:/ –

+0

這是你會在不同語言和應用程序前端以及不同數據中一次又一次遇到的問題之一。我在我的數據庫查詢和JavaScript中處理了分頁。這隻取決於我是否想避免將數千行排到瀏覽器或讓用戶受苦。 –

回答

4

到實例瓦爾您可以隨時加載必要的參數:

@page = params[:page] || 1 

,然後用它作爲你在做:

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

非常感謝你,爲什麼我沒有弄明白我可以使用params [] hash?:D –

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 
+0

謝謝,但第一個答案覆蓋點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