Coding
will_paginate與ransack
2014.Jun.05
#Gem#Rails#Learning

這篇主要介紹兩個很方便的 gem : will_paginate、ransack

這兩個 gem 很方便,star的人也很多!不過同時使用時會產生一些衝突,在此說明並記錄一下,以免自己未來又遇到一樣的問題!

  1. will_paginate 幫過長的頁面加入分頁功能,例如: will_paginate_example

  2. ransack 可讓增加文章搜尋的功能,例如: ransack_example


will_paginate

  • 首先先裝 will_paginate gem
# 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 的view index.html.erb 中,到希望出現分頁符號的位置加入下方code 以及class 名稱,就完成了:
<div class="apple_pagination">
  <%= will_paginate @posts%>
</div>

ransack

  • 再來裝 ransack gem
# 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
  • controller 都設定好就可以去view 加上搜尋表單了:
<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 的錯:

will_paginate & ransack 的小衝突

後來試了幾次才知道原來是要在 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
用Rails Helper幫你打掃Code
2014.Jul.29
看看世界-多看前輩的code
2014.May.25
comments powered by Disqus