现代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许可。