現代Web應用程序框架和ORMS的基於範圍和引擎的範圍和引擎
不會在全球污染Array
, Hash
, Object
或AR::Base
。
只需捆紮寶石,然後您的模型就可以分頁了。無需配置。不必在模型或助手中定義任何內容。
一切都是可以鏈的,而“大hasheris”較少。你知道,那是現代的鐵軌方式。沒有特殊的收集類別或分頁值的任何內容,而是使用一般AR::Relation
實例。因此,當然,您可以在Paginator範圍之前或之後鏈接其他任何條件。
由於整個分頁輔助人員基本上只是鏈接和非鏈接的集合,因此Kaminari通過引擎內部的部分模板來呈現它們的每個鏈接。因此,您可以通過覆蓋部分模板來輕鬆修改其行為,樣式或其他任何內容。
Kaminari支持多個ORMS(ActivereCord,DatamApper,Mongoid,Mongomapper),多個Web框架(Rails,Sinatra,Grape)和多個模板引擎(ERB,HAML,SLIM)。
分頁輔助器默認情況下輸出HTML5 <nav>
標籤。另外,助手支持軌道不引人注目的Ajax。
紅寶石2.1、2.2、2.3、2.4、2.5、2.6、2.7、3.0、3.1、3.2、3.3
Rails 4.1、4.2、5.0、5.1、5.2、6.0、6.1、7.0、7.1、7.2、8.0
Sinatra 1.4,2.0
HAML 3+
牛角3+
Mongomapper 0.9+
DatamApper 1.1.0+
要在默認的導軌堆棧上安裝Kaminari,只需將此行放入您的Gemfile中:
gem 'kaminari'
然後捆綁:
% bundle
如果您要構建非軌道或非Activerecord應用程序,並且想要上面的分頁功能,請查看其他框架/圖書館支持部分。
page
範圍獲取用戶的第七頁(默認per_page
為25)
User . page ( 7 )
注意:分頁從第1頁開始,而不是在第0頁(第(0)頁將返回與第(1)頁相同的結果)。
Kaminari不會向查詢添加order
。為了避免驚喜,您通常應該在分頁的查詢中包括訂單。例如:
User . order ( :name ) . page ( 7 )
您可以使用以下方法獲取頁碼或頁麵條件。
User . count #=> 1000
User . page ( 1 ) . limit_value #=> 20
User . page ( 1 ) . total_pages #=> 50
User . page ( 1 ) . current_page #=> 1
User . page ( 1 ) . next_page #=> 2
User . page ( 2 ) . prev_page #=> 1
User . page ( 1 ) . first_page? #=> true
User . page ( 50 ) . last_page? #=> true
User . page ( 100 ) . out_of_range? #=> true
per
範圍每個頁面顯示更多用戶(更改per
值)
User . order ( :name ) . page ( 7 ) . per ( 50 )
請注意, per
範圍不是在模型上直接定義的,而只是頁面範圍上定義的一種方法。這是絕對合理的,因為如果不指定page
,您將永遠不會per
使用。
請記住, per
內部使用limit
,因此它將覆蓋以前設置的任何limit
。如果要獲得所有請求記錄的大小,則可以使用total_count
方法:
User . count #=> 1000
a = User . limit ( 5 ) ; a . count #=> 5
a . page ( 1 ) . per ( 20 ) . size #=> 20
a . page ( 1 ) . per ( 20 ) . total_count #=> 1000
padding
範圍有時,您需要添加許多頁面大小的記錄。
User . order ( :name ) . page ( 7 ) . per ( 50 ) . padding ( 3 )
請注意, padding
範圍也未直接在模型上定義。
如果由於某種原因您需要取消except(:limit, :offset)
page
和per
方法
users = User . order ( :name ) . page ( 7 ) . per ( 50 )
unpaged_users = users . except ( :limit , :offset ) # unpaged_users will not use the kaminari scopes
您可以使用Kaminari.configure
方法通過覆蓋這些值來配置以下默認值。
default_per_page # 25 by default
max_per_page # nil by default
max_pages # nil by default
window # 4 by default
outer_window # 0 by default
left # 0 by default
right # 0 by default
page_method_name # :page by default
param_name # :page by default
params_on_first_page # false by default
有一個方便的生成器將默認配置文件生成config/initializers目錄。運行以下生成器命令,然後編輯生成的文件。
% rails g kaminari:config
page_method_name
您可以將“方法名稱” page
更改為bonzo
或plant
或您喜歡的任何東西,以便使用現有的page
方法,關聯或範圍或任何其他在模型上定義page
方法的插件。
paginates_per
配置每個模型的默認per_page值您可以使用以下聲明的DSL指定每個模型每個模型的默認per_page
值。
class User < ActiveRecord :: Base
paginates_per 50
end
max_paginates_per
配置每個模型的最大per_page值您可以使用以下聲明的DSL指定每個模型的最大per_page
值。如果通過per
範圍指定的變量大於此變量,則使用max_paginates_per
代替它。默認值為nil,這意味著您沒有強加任何最大per_page
值。
class User < ActiveRecord :: Base
max_paginates_per 100
end
max_pages
為每個模型配置max_pages值您可以使用以下聲明的DSL指定每個模型的max_pages
值。該值限制了可以返回的頁面總數。對於設定大型收藏的限制很有用。
class User < ActiveRecord :: Base
max_pages 100
end
如果您使用的是ransack_memory
Gem並遇到問題回到上一頁或第一頁,請將params_on_first_page
設置設置為true
。
params[:page]
中通常,您的控制器代碼看起來像這樣:
@users = User . order ( :name ) . page params [ :page ]
只需致電paginate
助手:
<%= paginate @users %>
這將渲染幾個?page=N
分頁鏈接,被HTML5 <nav>
標記包圍。
paginate
助手方法 <%= paginate @users %>
這將輸出幾個分頁鏈接,例如« First ‹ Prev ... 2 3 4 5 6 7 8 9 10 ... Next › Last »
。
<%= paginate @users, window: 2 %>
這將輸出類似... 5 6 7 8 9 ...
當7是當前頁面時。
<%= paginate @users, outer_window: 3 %>
這將輸出大約1 2 3 ...(snip)... 18 19 20
總共有20頁。
<%= paginate @users, left: 1, right: 3 %>
這將輸出類似1 ...(snip)... 18 19 20
,總共有20頁。
:param_name
) <%= paginate @users, param_name: :pagina %>
這將修改每個鏈接上的查詢參數名稱。
:params
) <%= paginate @users, params: {controller: 'foo', action: 'bar', format: :turbo_stream} %>
這將修改每個鏈接的url_option
。 :controller
和:action
可能是共同的密鑰。
<%= paginate @users, remote: true %>
這會將data-remote="true"
添加到內部的所有鏈接中。
<%= paginate @users, views_prefix: 'templates' %>
這將在app/views/templates/kaminari
中搜索部分。此選項使使用新/舊模板同時使用A/B測試分頁模板/主題之類的操作變得更加容易,並且可以更好地與其他GEM(例如細胞)進行整合。
link_to_next_page
和link_to_previous_page
(與link_to_prev_page
) <%= link_to_next_page @items, 'Next Page' %>
這只是呈現到下一頁的鏈接。這將有助於創建Twitter式的分頁功能。
助手方法支持一個params
選項,以進一步指定鏈接。如果需要設置format
,請將其包含在params
哈希中。
<%= link_to_next_page @items, 'Next Page', params: {controller: 'foo', action: 'bar', format: :turbo_stream} %>
page_entries_info
助手方法 <%= page_entries_info @posts %>
這將呈現出有用的消息,其中顯示了顯示的數量和總條目。
默認情況下,該消息將使用集合中的對象的人性化類名稱:例如,ProjectType模型的“項目類型”。名稱空間將被刪除,只使用姓氏。用:entry_name
參數:
<%= page_entries_info @posts, entry_name: 'item' %>
#= > Displaying items 6 - 10 of 26 in total
rel_next_prev_link_tags
助手方法 <%= rel_next_prev_link_tags @users %>
這將呈現REL NEXT和PREV鏈接標籤。
path_to_next_page
助手方法 <%= path_to_next_page @users %>
這將服務器相對路徑返回下一頁。
path_to_prev_page
助手方法 <%= path_to_prev_page @users %>
這將服務器相對路徑返回到上一頁。
“第一個”,“最後”,“上一個”,“ ...”和“ Next”的默認標籤存儲在引擎內的I18N YAML中,並通過I18N API渲染。您可以為您的國際化應用程序切換標籤值。鍵和默認值如下。您可以通過將其添加到Rails.root/config/locales
目錄中的YAML文件來覆蓋它們。
en :
views :
pagination :
first : " « First "
last : " Last » "
previous : " ‹ Prev "
next : " Next › "
truncate : " … "
helpers :
page_entries_info :
one_page :
display_entries :
zero : " No %{entry_name} found "
one : " Displaying <b>1</b> %{entry_name} "
other : " Displaying <b>all %{count}</b> %{entry_name} "
more_pages :
display_entries : " Displaying %{entry_name} <b>%{first}–%{last}</b> of <b>%{total}</b> in total "
如果使用非英語本地化,請參見I18N規則以更改one_page:display_entries
塊。
Kaminari包括一個方便的模板生成器。
首先運行發電機,
% rails g kaminari:views default
然後在應用程序的app/views/kaminari/
Directory中編輯部分。
您可以使用HTML2HAML GEM或HTML2SLIM GEM轉換ERB模板。如果您將它們放入app/views/kaminari/
則Kaminari Gem將自動拾取HAML/SLIM模板。
如果您需要使用不同的Paginator模板(例如,公共和管理員),則可以通過--views-prefix directory
如下:
% rails g kaminari:views default --views-prefix admin
這將在app/views/admin/kaminari/
Directory中產生部分。
發電機還可以從外部存儲庫(https://github.com/amatsuda/kaminari_themes)中獲取幾個樣本模板主題,此外還可以幫助您創建一個漂亮的Paginator。
% rails g kaminari:views THEME
要查看可用主題的完整列表,請查看主題存儲庫,或者只是在沒有指定THEME
參數的情況下擊中發電機。
% rails g kaminari:views
要在單個應用程序中使用多個主題,請在應用程序/視圖/kaminari/中創建一個目錄,然後將自定義模板文件移至該目錄中。
% rails g kaminari:views default (skip if you have existing kaminari views)
% cd app/views/kaminari
% mkdir my_custom_theme
% cp _ * .html. * my_custom_theme/
接下來,在調用paginate
方法時引用該目錄:
<%= paginate @users, theme: 'my_custom_theme' %>
自定義!
注意:如果主題不存在或指定未指定,則Kaminari將默認回到GEM中包含的視圖。
通常,Paginator需要知道顯示鏈接的記錄總數,但是有時我們不需要記錄總數,只需要“上一頁”和“下一頁”鏈接。對於這種用例,Kaminari提供了without_count
模式,該模式可以創建Paginatable Collection,而無需計算所有記錄的數量。當您處理一個非常大的數據集時,這可能會有所幫助,因為依靠大桌子在RDBM上往往會變得慢。
只需將.without_count
添加到分頁對象:
User . page ( 3 ) . without_count
在您的視圖文件中,您只能使用以下簡單的助手,而不是全功能的paginate
助手:
<%= link_to_prev_page @users, 'Previous Page' %>
<%= link_to_next_page @users, 'Next Page' %>
Kaminari提供了一個數組包裝類,該類別將通用數組對象調整到paginate
View輔助器。但是, paginate
助手不會自動處理您的數組對象(這是故意的,並且是設計)。 Kaminari::paginate_array
方法將您的數組對象轉換為接受page
方法的Paginatable數組。
@paginatable_array = Kaminari . paginate_array ( my_array_object ) . page ( params [ :page ] ) . per ( 10 )
您可以通過選項哈希指定total_count
值。當處理與實際count
不同的count
值(例如RSOLR搜索結果)或需要生成自定義分頁時的數量值不同的數組對象時,這將很有幫助。例如:
@paginatable_array = Kaminari . paginate_array ( [ ] , total_count : 145 ) . page ( params [ :page ] ) . per ( 10 )
或者,如果使用外部API來源來摘錄數據頁面:
page_size = 10
one_page = get_page_of_data params [ :page ] , page_size
@paginatable_array = Kaminari . paginate_array ( one_page . data , total_count : one_page . total_count ) . page ( params [ :page ] ) . per ( page_size )
由於page
參數和導軌路由,您可以輕鬆地生成SEO和用戶友好的URL。對於您要分頁的任何資源,只需將以下內容添加到您的routes.rb
中。rb:
resources :my_resources do
get 'page/:page' , action : :index , on : :collection
end
如果您使用的是4或以後的Rails,則可以通過使用concern
來簡化路由定義:
concern :paginatable do
get '(page/:page)' , action : :index , on : :collection , as : ''
end
resources :my_resources , concerns : :paginatable
這將創建諸如/my_resources/page/33
而不是/my_resources?page=33
。現在這是一個友好的URL,但它還具有其他額外的好處...
由於page
參數現在是URL段,因此我們可以在Rails Page緩存上利用!
注意:在此示例中,我指出了通往我的:index
動作的路線。您可能已經在控制器中定義了自定義的分頁操作 - 您應該指向action: :your_custom_action
。
從技術上講,Kaminari Gem由3個單獨的組成部分組成:
kaminari-core: the core pagination logic
kaminari-activerecord: Active Record adapter
kaminari-actionview: Action View adapter
因此,捆綁的gem 'kaminari'
等同於以下兩行(從適配器中引用kaminari核):
gem 'kaminari-activerecord'
gem 'kaminari-actionview'
如果您想使用其他支持的ORM而不是ActiverEcord,例如Mongoid,請捆綁其適配器而不是Kaminari-Activerecord。
gem 'kaminari-mongoid'
gem 'kaminari-actionview'
Kaminari目前為以下ORM提供適配器:
如果您想使用其他Web框架而不是Rails + Action View,例如Sinatra,請捆綁其適配器而不是Kaminari-ActionView。
gem 'kaminari-activerecord'
gem 'kaminari-sinatra'
Kaminari目前為以下網絡框架提供適配器:
在Github Wiki上查看Kaminari食譜,以獲取更高級的技巧和技術。 https://github.com/kaminari/kaminari/wiki/kaminari-recipes
請隨時在Github(Amatsuda)或Twitter(@a_matsuda)☇☇☇:)上向我發消息::)
叉,修復,然後發送拉動請求。
在本地運行所有受支持框架的測試套件:
% bundle install
% rake test:all
針對一個框架的測試套件:
% rake test:active_record_50
您可以通過運行rake -T
找到受支持的測試任務的列表。您可能還會發現為特定框架運行特定測試很有用。為此,您必須首先確保已將所有配置的所有內容捆綁在一起,然後可以運行特定的測試:
% BUNDLE_GEMFILE= ' gemfiles/active_record_50.gemfile ' bundle install
% BUNDLE_GEMFILE= ' gemfiles/active_record_50.gemfile ' TEST=kaminari-core/test/requests/navigation_test.rb bundle exec rake test
版權(c)2011年 - 秋馬松木。有關更多詳細信息,請參見MIT許可。