mirror of
https://github.com/kaminari/kaminari.git
synced 2022-11-09 13:44:37 -05:00
📝 copy edits
This commit is contained in:
parent
70da458140
commit
57f8db83cf
1 changed files with 153 additions and 75 deletions
228
README.md
228
README.md
|
|
@ -49,11 +49,15 @@ The pagination helper outputs the HTML5 `<nav>` tag by default. Plus, the helper
|
|||
|
||||
Put this line in your Gemfile:
|
||||
|
||||
gem 'kaminari'
|
||||
```ruby
|
||||
gem 'kaminari'
|
||||
```
|
||||
|
||||
Then bundle:
|
||||
|
||||
% bundle
|
||||
```sh
|
||||
% bundle
|
||||
```
|
||||
|
||||
|
||||
## Query Basics
|
||||
|
|
@ -62,7 +66,9 @@ Then bundle:
|
|||
|
||||
To fetch the 7th page of users (default `per_page` is 25)
|
||||
|
||||
User.page(7)
|
||||
```ruby
|
||||
User.page(7)
|
||||
```
|
||||
|
||||
Note: pagination starts at page 1, not at page 0 (page(0) will return the same results as page(1)).
|
||||
|
||||
|
|
@ -70,24 +76,30 @@ Note: pagination starts at page 1, not at page 0 (page(0) will return the same r
|
|||
|
||||
To show a lot more users per each page (change the `per_page` value)
|
||||
|
||||
User.page(7).per(50)
|
||||
```ruby
|
||||
User.page(7).per(50)
|
||||
```
|
||||
|
||||
Note that the `per` scope is not directly defined on the models but is just a method defined on the page scope.
|
||||
This is absolutely reasonable because you will never actually use `per_page` without specifying the `page` number.
|
||||
|
||||
Keep in mind that `per` internally utilizes `limit` and so it will override any `limit` that was set previously.
|
||||
And if you want get size for all request records you can use `total_count` method:
|
||||
And if you want to get the size for all request records you can use `total_count` method:
|
||||
|
||||
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
|
||||
```ruby
|
||||
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
|
||||
```
|
||||
|
||||
### The `padding` Scope
|
||||
|
||||
Occasionally you need to pad a number of records that is not a multiple of the page size.
|
||||
|
||||
User.page(7).per(50).padding(3)
|
||||
```ruby
|
||||
User.page(7).per(50).padding(3)
|
||||
```
|
||||
|
||||
Note that the `padding` scope also is not directly defined on the models.
|
||||
|
||||
|
|
@ -109,7 +121,9 @@ You can configure the following default values by overriding these values using
|
|||
There's a handy generator that generates the default configuration file into config/initializers directory.
|
||||
Run the following generator command, then edit the generated file.
|
||||
|
||||
% rails g kaminari:config
|
||||
```sh
|
||||
% rails g kaminari:config
|
||||
```
|
||||
|
||||
### Changing `page_method_name`
|
||||
|
||||
|
|
@ -121,9 +135,11 @@ You can change the method name `page` to `bonzo` or `plant` or whatever you like
|
|||
|
||||
You can specify default `per_page` value per each model using the following declarative DSL.
|
||||
|
||||
class User < ActiveRecord::Base
|
||||
paginates_per 50
|
||||
end
|
||||
```ruby
|
||||
class User < ActiveRecord::Base
|
||||
paginates_per 50
|
||||
end
|
||||
```
|
||||
|
||||
## Configuring Max per_page Value for Each Model
|
||||
|
||||
|
|
@ -133,9 +149,11 @@ You can specify max `per_page` value per each model using the following declarat
|
|||
If the variable that specified via `per` scope is more than this variable, `max_paginates_per` is used instead of it.
|
||||
Default value is nil, which means you are not imposing any max `per_page` value.
|
||||
|
||||
class User < ActiveRecord::Base
|
||||
max_paginates_per 100
|
||||
end
|
||||
```ruby
|
||||
class User < ActiveRecord::Base
|
||||
max_paginates_per 100
|
||||
end
|
||||
```
|
||||
|
||||
## Controllers
|
||||
|
||||
|
|
@ -143,7 +161,9 @@ Default value is nil, which means you are not imposing any max `per_page` value.
|
|||
|
||||
Typically, your controller code will look like this:
|
||||
|
||||
@users = User.order(:name).page params[:page]
|
||||
```ruby
|
||||
@users = User.order(:name).page params[:page]
|
||||
```
|
||||
|
||||
|
||||
## Views
|
||||
|
|
@ -152,7 +172,9 @@ Typically, your controller code will look like this:
|
|||
|
||||
Just call the `paginate` helper:
|
||||
|
||||
<%= paginate @users %>
|
||||
```erb
|
||||
<%= paginate @users %>
|
||||
```
|
||||
|
||||
This will render several `?page=N` pagination links surrounded by an HTML5 `<nav>` tag.
|
||||
|
||||
|
|
@ -161,87 +183,115 @@ This will render several `?page=N` pagination links surrounded by an HTML5 `<nav
|
|||
|
||||
### The `paginate` Helper Method
|
||||
|
||||
<%= paginate @users %>
|
||||
```erb
|
||||
<%= paginate @users %>
|
||||
```
|
||||
|
||||
This would output several pagination links such as `« First ‹ Prev ... 2 3 4 5 6 7 8 9 10 ... Next › Last »`
|
||||
|
||||
### Specifying the "inner window" Size (4 by default)
|
||||
|
||||
<%= paginate @users, window: 2 %>
|
||||
```erb
|
||||
<%= paginate @users, window: 2 %>
|
||||
```
|
||||
|
||||
This would output something like `... 5 6 7 8 9 ...` when 7 is the current
|
||||
page.
|
||||
|
||||
### Specifying the "outer window" Size (0 by default)
|
||||
|
||||
<%= paginate @users, outer_window: 3 %>
|
||||
```erb
|
||||
<%= paginate @users, outer_window: 3 %>
|
||||
```
|
||||
|
||||
This would output something like `1 2 3 4 ...(snip)... 17 18 19 20` while having 20 pages in total.
|
||||
|
||||
### Outer Window Can Be Separately Specified by left, right (0 by default)
|
||||
|
||||
<%= paginate @users, left: 1, right: 3 %>
|
||||
```erb
|
||||
<%= paginate @users, left: 1, right: 3 %>
|
||||
```
|
||||
|
||||
This would output something like `1 ...(snip)... 18 19 20` while having 20 pages in total.
|
||||
|
||||
### Changing the Parameter Name (`:param_name`) for the Links
|
||||
|
||||
<%= paginate @users, param_name: :pagina %>
|
||||
```erb
|
||||
<%= paginate @users, param_name: :pagina %>
|
||||
```
|
||||
|
||||
This would modify the query parameter name on each links.
|
||||
|
||||
### Extra Parameters (`:params`) for the Links
|
||||
|
||||
<%= paginate @users, params: {controller: 'foo', action: 'bar'} %>
|
||||
```erb
|
||||
<%= paginate @users, params: {controller: 'foo', action: 'bar'} %>
|
||||
```
|
||||
|
||||
This would modify each link's `url_option`. :`controller` and :`action` might be the keys in common.
|
||||
|
||||
### Ajax Links (crazy simple, but works perfectly!)
|
||||
|
||||
<%= paginate @users, remote: true %>
|
||||
```erb
|
||||
<%= paginate @users, remote: true %>
|
||||
```
|
||||
|
||||
This would add `data-remote="true"` to all the links inside.
|
||||
|
||||
### Specifying an Alternative Views Directory (default is kaminari/)
|
||||
|
||||
<%= paginate @users, views_prefix: 'templates' %>
|
||||
```erb
|
||||
<%= paginate @users, views_prefix: 'templates' %>
|
||||
```
|
||||
|
||||
This would search for partials in `app/views/templates/kaminari`.
|
||||
This option makes it easier to do things like A/B testing pagination templates/themes, using new/old templates at the same time as well as better integration with other gems such as [cells](https://github.com/apotonick/cells).
|
||||
|
||||
### The `link_to_next_page` and `link_to_previous_page` Helper Methods
|
||||
|
||||
<%= link_to_next_page @items, 'Next Page' %>
|
||||
```erb
|
||||
<%= link_to_next_page @items, 'Next Page' %>
|
||||
```
|
||||
|
||||
This simply renders a link to the next page. This would be helpful for creating a Twitter-like pagination feature.
|
||||
|
||||
### The `page_entries_info` Helper Method
|
||||
|
||||
<%= page_entries_info @posts %>
|
||||
```erb
|
||||
<%= page_entries_info @posts %>
|
||||
```
|
||||
|
||||
This renders a helpful message with numbers of displayed vs. total entries.
|
||||
|
||||
By default, the message will use the humanized class name of objects in collection: for instance, "project types" for ProjectType models.
|
||||
The namespace will be cut out and only the last name will be used. Override this with the `:entry_name` parameter:
|
||||
|
||||
<%= page_entries_info @posts, entry_name: 'item' %>
|
||||
#=> Displaying items 6 - 10 of 26 in total
|
||||
```erb
|
||||
<%= page_entries_info @posts, entry_name: 'item' %>
|
||||
#=> Displaying items 6 - 10 of 26 in total
|
||||
```
|
||||
|
||||
### The `rel_next_prev_link_tags` Helper Method
|
||||
|
||||
<%= rel_next_prev_link_tags @users %>
|
||||
```erb
|
||||
<%= rel_next_prev_link_tags @users %>
|
||||
```
|
||||
|
||||
This renders the rel next and prev link tags for the head.
|
||||
|
||||
### The `path_to_next_page` Helper Method
|
||||
|
||||
<%= path_to_next_page @users %>
|
||||
```erb
|
||||
<%= path_to_next_page @users %>
|
||||
```
|
||||
|
||||
This returns the server relative path to the next page.
|
||||
|
||||
### The `path_to_prev_page` Helper Method
|
||||
|
||||
<%= path_to_prev_page @users %>
|
||||
```erb
|
||||
<%= path_to_prev_page @users %>
|
||||
```
|
||||
|
||||
This returns the server relative path to the previous page.
|
||||
|
||||
|
|
@ -250,23 +300,25 @@ This returns the server relative path to the previous page.
|
|||
The default labels for 'first', 'last', 'previous', '...' and 'next' are stored in the I18n yaml inside the engine, and rendered through I18n API.
|
||||
You can switch the label value per I18n.locale for your internationalized application. Keys and the default values are the following. You can override them by adding to a YAML file in your `Rails.root/config/locales` directory.
|
||||
|
||||
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"
|
||||
```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"
|
||||
```
|
||||
|
||||
If you use non-English localization see [i18n rules](https://github.com/svenfuchs/i18n/blob/master/test/test_data/locales/plurals.rb) for changing
|
||||
`one_page:display_entries` block.
|
||||
|
|
@ -279,7 +331,9 @@ Kaminari includes a handy template generator.
|
|||
|
||||
Run the generator first,
|
||||
|
||||
% rails g kaminari:views default
|
||||
```sh
|
||||
% rails g kaminari:views default
|
||||
```
|
||||
|
||||
then edit the partials in your app's `app/views/kaminari/` directory.
|
||||
|
||||
|
|
@ -292,7 +346,9 @@ The kaminari gem will automatically pick up haml/slim templates if you place the
|
|||
|
||||
In case you need different templates for your paginator (for example public and admin), you can pass `--views-prefix directory` like this:
|
||||
|
||||
% rails g kaminari:views default --views-prefix admin
|
||||
```sh
|
||||
% rails g kaminari:views default --views-prefix admin
|
||||
```
|
||||
|
||||
that will generate partials in `app/views/admin/kaminari/` directory.
|
||||
|
||||
|
|
@ -300,24 +356,32 @@ that will generate partials in `app/views/admin/kaminari/` directory.
|
|||
|
||||
The generator has the ability to fetch several sample template themes from the external repository (https://github.com/amatsuda/kaminari_themes) in addition to the bundled "default" one, which will help you creating a nice looking paginator.
|
||||
|
||||
% rails g kaminari:views THEME
|
||||
```sh
|
||||
% rails g kaminari:views THEME
|
||||
```
|
||||
|
||||
To see the full list of available themes, take a look at the themes repository, or just hit the generator without specifying `THEME` argument.
|
||||
|
||||
% rails g kaminari:views
|
||||
```sh
|
||||
% rails g kaminari:views
|
||||
```
|
||||
|
||||
### Multiple Themes
|
||||
|
||||
To utilize multiple themes from within a single application, create a directory within the app/views/kaminari/ and move your custom template files into that directory.
|
||||
|
||||
% 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/
|
||||
```sh
|
||||
% 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/
|
||||
```
|
||||
|
||||
Next, reference that directory when calling the `paginate` method:
|
||||
|
||||
<%= paginate @users, theme: 'my_custom_theme' %>
|
||||
```erb
|
||||
<%= paginate @users, theme: 'my_custom_theme' %>
|
||||
```
|
||||
|
||||
Customize away!
|
||||
|
||||
|
|
@ -329,31 +393,39 @@ Note: if the theme isn't present or none is specified, kaminari will default bac
|
|||
Kaminari provides an Array wrapper class that adapts a generic Array object to the `paginate` view helper. However, the `paginate` helper doesn't automatically handle your Array object (this is intentional and by design).
|
||||
`Kaminari::paginate_array` method converts your Array object into a paginatable Array that accepts `page` method.
|
||||
|
||||
@paginatable_array = Kaminari.paginate_array(my_array_object).page(params[:page]).per(10)
|
||||
```ruby
|
||||
@paginatable_array = Kaminari.paginate_array(my_array_object).page(params[:page]).per(10)
|
||||
```
|
||||
|
||||
You can specify the `total_count` value through options Hash. This would be helpful when handling an Array-ish object that has a different `count` value from actual `count` such as RSolr search result or when you need to generate a custom pagination. For example:
|
||||
|
||||
@paginatable_array = Kaminari.paginate_array([], total_count: 145).page(params[:page]).per(10)
|
||||
```ruby
|
||||
@paginatable_array = Kaminari.paginate_array([], total_count: 145).page(params[:page]).per(10)
|
||||
```
|
||||
|
||||
## Creating Friendly URLs and Caching
|
||||
|
||||
Because of the `page` parameter and Rails routing, you can easily generate SEO and user-friendly URLs. For any resource you'd like to paginate, just add the following to your `routes.rb`:
|
||||
|
||||
resources :my_resources do
|
||||
get 'page/:page', action: :index, on: :collection
|
||||
end
|
||||
```ruby
|
||||
resources :my_resources do
|
||||
get 'page/:page', action: :index, on: :collection
|
||||
end
|
||||
```
|
||||
|
||||
If you are using Rails 4 or later, you can simplify route definitions by using `concern`:
|
||||
|
||||
concern :paginatable do
|
||||
get '(page/:page)', action: :index, on: :collection, as: ''
|
||||
end
|
||||
```ruby
|
||||
concern :paginatable do
|
||||
get '(page/:page)', action: :index, on: :collection, as: ''
|
||||
end
|
||||
|
||||
resources :my_resources, concerns: :paginatable
|
||||
resources :my_resources, concerns: :paginatable
|
||||
```
|
||||
|
||||
This will create URLs like `/my_resources/page/33` instead of `/my_resources?page=33`. This is now a friendly URL, but it also has other added benefits...
|
||||
|
||||
Because the `page` parameter is now a URL segment, we can leverage on Rails [page caching](http://guides.rubyonrails.org/caching_with_rails.html#page-caching)!
|
||||
Because the `page` parameter is now a URL segment, we can leverage on Rails page [caching](http://guides.rubyonrails.org/caching_with_rails.html#page-caching)!
|
||||
|
||||
NOTE: In this example, I've pointed the route to my `:index` action. You may have defined a custom pagination action in your controller - you should point `action: :your_custom_action` instead.
|
||||
|
||||
|
|
@ -379,17 +451,23 @@ Fork, fix, then send a pull request.
|
|||
|
||||
To run the test suite locally against all supported frameworks:
|
||||
|
||||
% bundle install
|
||||
% rake test:all
|
||||
```sh
|
||||
% bundle install
|
||||
% rake test:all
|
||||
```
|
||||
|
||||
To target the test suite against one framework:
|
||||
|
||||
% rake test:active_record_50
|
||||
```sh
|
||||
% rake test:active_record_50
|
||||
```
|
||||
|
||||
You can find a list of supported test tasks by running `rake -T`. You may also find it useful to run a specific test for a specific framework. To do so, you'll have to first make sure you have bundled everything for that configuration, then you can run the specific test:
|
||||
|
||||
% 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
|
||||
```sh
|
||||
% 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
|
||||
```
|
||||
|
||||
## Copyright
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue