這篇主要介紹兩個很方便的 gem : will_paginate、ransack
這兩個 gem 很方便,star的人也很多!不過同時使用時會產生一些衝突,在此說明並記錄一下,以免自己未來又遇到一樣的問題!
will_paginate 幫過長的頁面加入分頁功能,例如:
ransack 可讓增加文章搜尋的功能,例如:
# Gemfile
gem 'will_paginate', '~> 3.0'
posts_controller.rb
,將原本在index 中的 @posts=Post.all
修改為:def index
#分頁設定每頁顯示四篇文章
@posts = Post.paginate(:page => params[:page], :per_page => 4)
end
index.html.erb
中,到希望出現分頁符號的位置加入下方code 以及class 名稱,就完成了:<div class="apple_pagination">
<%= will_paginate @posts%>
</div>
# Gemfile
gem "ransack", github: "activerecord-hackery/ransack", branch: "rails-4.1"
posts_controller.rb
加入:def index
#這是剛剛will_paginate加的
@posts = Post.paginate(:page => params[:page], :per_page => 4)
#讓posts#index可以顯現搜尋結果,@q 是ransack gem定義的寫法,下方再做說明
@posts = @q.result
end
application_controller.rb
加入:class ApplicationController < ActionController::Base
#讓在執行任何動作之前,先呼叫set_search,才能讓view知道 `@q` 是啥!不然會噴錯,說他找不到ransack!
before_action :set_search
protected
def set_search
@q = Post.search(params[:q])
end
end
<div id="search" >
<%= search_form_for @q do |f| %>
#search_form_for是ransack自己定義的form helper。
#cont 就是 contains,所以我設定我的搜尋位置為文章的 title 或 body
<%= f.text_field :title_or_body_cont %>
<%= f.submit ' ', :class => 'btn-search' %>
<% end %>
</div>
搜尋位置的設定可以參考這裡。
其實,兩個 gem 的設定照上述已經搞定了,結果每次我一按搜尋,就噴這個 undefined method total_pages
的錯:
後來試了幾次才知道原來是要在 posts_controller.rb
修正為如下的 code,讓無論有沒有搜尋過的 posts 都能符合分頁的規定,就沒問題了!
def index
@posts = Post.paginate(:page => params[:page], :per_page => 4)
@posts = @q.result.paginate(:page => params[:page], :per_page => 4)
end