현대 웹 앱 프레임 워크 및 ORM을위한 스코프 및 엔진 기반, 깨끗하고 강력하며 사용자 정의 가능하며 정교한 페이지 분비물
Array
, Hash
, Object
또는 AR::Base
전 세계적으로 오염되지 않습니다.
보석을 묶은 다음 모델이 페이지를 입을 준비가되었습니다. 구성이 필요하지 않습니다. 모델이나 도우미의 어떤 것도 정의 할 필요가 없습니다.
모든 것이 "해초염"이 적은 방법으로 연쇄 될 수 있습니다. 알다시피, 그것은 현대적인 철도입니다. 일반 AR::Relation
인스턴스를 사용하여 Paginated 값에 대한 특수 컬렉션 클래스 나 아무것도 없습니다. 물론 이주자 범위 전후에 다른 조건을 체인 할 수 있습니다.
전체 Pagination 도우미는 기본적으로 링크와 비 링크 모음이므로 Kaminari는 엔진 내부의 자체 부분 템플릿을 통해 각각을 렌더링합니다. 따라서 부분 템플릿을 무시하여 동작, 스타일 또는 무엇이든 쉽게 수정할 수 있습니다.
Kaminari는 여러 개의 ORM (Activerecord, Datamapper, Mongomaper), 다중 웹 프레임 워크 (Rails, Sinatra, Grape) 및 다중 템플릿 엔진 (ERB, Haml, Slim)을 지원합니다.
Pagination 도우미는 기본적으로 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
시나트라 1.4, 2.0
Haml 3+
Mongoid 3+
몽고퍼 0.9+
Datamapper 1.1.0+
기본 레일 스택에 Kaminari를 설치하려면이 라인을 보석에 넣으십시오.
gem 'kaminari'
다음 번에 번들 묶은 다음 번들을 번들 묶은 다음 번들을 번들 다 묶어 묶어 묶어 묶어 묶어 묶어 묶어 묶어 묶어 묶어 묶어 묶어 묶습니다. 다음 번 들기를 번들 번들 묶습니다 : 번들 묶음 : 번들 번들 묶음 : 번들 다 묶음 : 번들 묶음 : 번들 다 묶음 : 번들 다 묶음.
% bundle
비 레일 또는 비 ActiveRecord 앱을 구축하고 Pagination 기능을 원하는 경우 다른 프레임 워크/라이브러리 지원 섹션을 살펴보십시오.
page
범위 사용자의 7 번째 페이지를 가져 오려면 (기본값 per_page
는 25)
User . page ( 7 )
참고 : Pagination은 1 페이지에서 시작합니다 (페이지 (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
범위는 모델에 직접 정의되지 않습니다.
어떤 이유로 어떤 이유로 당신이 호출 page
와 메소드 per
전화를 걸어야 except(:limit, :offset)
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
의 각 모델의 MAX PER_PAGE 값 구성 다음 선언 DSL을 사용하여 각 모델 당 MAX per_page
값을 지정할 수 있습니다. per
를 통해 지정된 변수 가이 변수보다 많으면 max_paginates_per
대신 사용됩니다. 기본값은 nil이므로 MAX 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 %>
이렇게하면 HTML5 <nav>
태그로 둘러싸인 몇 가지 ?page=N
Pagination 링크가 렌더링됩니다.
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 %>
이것은 총 20 페이지가있는 동안 1 ...(snip)... 18 19 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 테스트 페이지 매김 템플릿/테마와 같은 작업을보다 쉽게 수행 할 수 있습니다.
link_to_next_page
및 link_to_previous_page
( link_to_prev_page
와 별칭) 도우미 방법 <%= link_to_next_page @items, 'Next Page' %>
이것은 단순히 다음 페이지에 대한 링크를 제공합니다. 이것은 트위터와 같은 페이지 매김 기능을 만드는 데 도움이 될 것입니다.
헬퍼 메소드는 링크를 추가로 지정하기 위해 params
옵션을 지원합니다. format
설정 해야하는 경우 params
Hash에 포함하십시오.
<%= 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 %>
이렇게하면 Head의 Next 및 Prev Link 태그를 렌더링합니다.
path_to_next_page
도우미 방법 <%= path_to_next_page @users %>
서버 상대 경로를 다음 페이지로 반환합니다.
path_to_prev_page
도우미 방법 <%= path_to_prev_page @users %>
서버 상대 경로를 이전 페이지로 반환합니다.
'First', 'last', 'previous', '...'및 'next'의 기본 레이블은 엔진 내부의 i18n Yaml에 저장되어 i18n API를 통해 렌더링됩니다. 국제화 된 응용 프로그램의 I18N.Locale 당 레이블 값을 전환 할 수 있습니다. 키와 기본값은 다음과 같습니다. 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 "
영어가 아닌 지역화를 사용하는 경우 one_page:display_entries
블록 변경에 대한 I18N 규칙을 참조하십시오.
Kaminari에는 편리한 템플릿 생성기가 포함되어 있습니다.
먼저 발전기를 실행하고
% rails g kaminari:views default
그런 다음 앱의 app/views/kaminari/
디렉토리의 부분을 편집하십시오.
html2haml gem 또는 html2slim gem을 사용하여 ERB 템플릿을 변환 할 수 있습니다. Kaminari Gem은 app/views/kaminari/
에 배치하면 HAML/SLIM 템플릿을 자동으로 수거합니다.
이 절약기 (예 : 공개 및 관리자)에 대해 다른 템플릿이 필요한 경우 --views-prefix directory
통과 할 수 있습니다.
% rails g kaminari:views default --views-prefix admin
app/views/admin/kaminari/
디렉토리에서 부분을 생성합니다.
발전기는 번들 된 "기본값"이외에 외부 저장소 (https://github.com/amatsuda/kaminari_themes)에서 여러 샘플 템플릿 테마를 가져올 수있는 기능을 갖추고있어 멋진 이주자를 만드는 데 도움이됩니다.
% rails g kaminari:views THEME
사용 가능한 테마의 전체 목록을 보려면 테마 저장소를 살펴 보거나 THEME
인수를 지정하지 않고 생성기를 누르십시오.
% rails g kaminari:views
단일 애플리케이션 내에서 여러 테마를 활용하려면 App/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에 포함 된 뷰로 기본적으로 회복됩니다.
일반적으로 이주자는 링크를 표시하기 위해 총 레코드 수를 알아야하지만 때로는 총 레코드 수가 필요하지 않으며 "이전 페이지"및 "다음 페이지"링크가 필요합니다. 이러한 유스 케이스의 경우 Kaminari는 모든 레코드의 수를 계산하지 않고도 컬렉션을 생성하는 without_count
모드없이 제공합니다. 큰 테이블을 의지하는 것은 RDBM에서 느리게되는 경향이 있기 때문에 매우 큰 데이터 세트를 처리 할 때 도움이 될 수 있습니다.
Paginated 객체에 .without_count
추가하기 만하면됩니다.
User . page ( 3 ) . without_count
View 파일에서는 완전한 기능을 갖춘이 paginate
헬퍼 대신 다음과 같은 간단한 도우미를 사용할 수 있습니다.
<%= link_to_prev_page @users, 'Previous Page' %>
<%= link_to_next_page @users, 'Next Page' %>
Kaminari는 일반 배열 객체를 paginate
View 도우미에 조정하는 배열 래퍼 클래스를 제공합니다. 그러나 paginate
Helper는 배열 객체를 자동으로 처리하지 않습니다 (이것은 의도적이고 설계 별). Kaminari::paginate_array
메소드 배열 객체를 page
메소드를 허용하는 이주성 배열로 변환합니다.
@paginatable_array = Kaminari . paginate_array ( my_array_object ) . page ( params [ :page ] ) . per ( 10 )
옵션 해시를 통해 total_count
값을 지정할 수 있습니다. 이것은 RSOLR 검색 결과와 같이 실제 count
count
다른 배열 객체를 처리하거나 사용자 정의 페이지 매김을 생성해야 할 때 도움이됩니다. 예를 들어:
@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을 쉽게 생성 할 수 있습니다. Pagination을 원하는 리소스의 경우 다음을 routes.rb
에 추가하십시오.
resources :my_resources do
get 'page/:page' , action : :index , on : :collection
end
Rails 4 이상을 사용하는 경우 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이 생성됩니다. 이것은 이제 친근한 URL이지만 다른 추가 혜택도 있습니다 ...
page
매개 변수는 이제 URL 세그먼트이므로 레일 페이지 캐싱에서 활용할 수 있습니다!
참고 :이 예에서는 다음과 같은 경로를 지적했습니다. :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'
다음 2 줄에 해당합니다 (카미 나리 코어는 어댑터에서 참조됩니다).
gem 'kaminari-activerecord'
gem 'kaminari-actionview'
ActiveRecord 대신 다른 지원되는 ORM을 사용하려면 Mongoid와 같은 Kaminari-Activerecord 대신 어댑터를 번들로하십시오.
gem 'kaminari-mongoid'
gem 'kaminari-actionview'
Kaminari는 현재 다음 orms에 대한 어댑터를 제공합니다.
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-License를 참조하십시오.