====== การแบ่งหน้าด้วย WillPaginate ======
บ่อยครั้งที่ view ของแอพพลิเคชั่นคุณต้องแสดงแค่ข้อมูลบางส่วนจากทั้งหมด ในกรณีนี้คุณต้องใช้เทคนิคการแบ่งหน้า (pagination) ซึ่งสามารถทำได้ไม่ยากโดยใช้ gem [[http://github.com/mislav/will_paginate/tree/master|WillPaginate]]
{{:getting-started:installation:stop.png|}}หมายเหตุ: คุณต้องใช้ Ruby gems เวอร์ชั่น 1.2 ขึ้นไปเพื่อใช้งาน WillPaginate
(เนื้อหาส่วนใหญ่ในหน้านี้มาจาก [[http://github.com/mislav/will_paginate/tree/master|เอกสารอ้างอิงของ WillPaginate]])
===== การติดตั้ง =====
WillPaginate gem ถูกสร้างโดย GitHub เพราะฉะนั้นคุณต้องเพิ่ม GitHub เป็นหนึ่งในแหล่งที่มาของ gem ของคุณ:
$ gem sources -a http://gems.github.com
ติดตั้งไลบรารี่:
$ gem install mislav-will_paginate
===== ใช้งาน Gem =====
==== Rails 2.0.x หรือก่อนหน้า ====
{{:getting-started:installation:stop.png|}}เริ่มใช้งานไลบรารี่นี้ได้ง่ายๆโดยโหลดมันขึ้นมาใน "config/environment.rb"
Rails::Initializer.run do |config|
...
end
require "will_paginate"
อย่าเพิ่มบรรทัด require ก่อนหรือภายในบล๊อก Rails::Initializer เพราะว่า Rails ยังไม่ถูกโหลดขึ้นมาในส่วนดังกล่าว
==== Rails 2.1 ขึ้นไป ====
สำหรับ Rails เวอร์ชั่น 2.1 ขึ้นไปเราแนะนำให้คุณใช้ Gem dependencies เพื่อโหลด will_paginate โดยเพิ่มโค้ดนี้เข้าไปในไฟล์ config/environment.rb:
Rails::Initializer.run do |config|
...
config.gem 'mislav-will_paginate',
:lib => 'will_paginate',
:source => 'http://gems.github.com'
...
end
===== ตัวอย่างการใช้งาน =====
ใช้ paginate finder ใน controller:
page = params[:page] || 1
@posts = Post.paginate_by_board_id @board.id, :page => page, :order => 'updated_at DESC'
Paginate ทำงานเหมือนกับ find — จะต่างกันก็ตรงที่มันไม่คืนทุก record มาให้คุณ เพราะฉะนั้นอย่าลืมบอกว่าคุณต้องการข้อมูลหน้าไหน ไม่งั้นคุณจะเจอปัญหาได้! ลองอ่านข้อมูลเพิ่มเติมที่หน้า [[http://mislav.uniqpath.com/static/will_paginate/doc/classes/WillPaginate/Finder/ClassMethods.html|WillPaginate::Finder::ClassMethods]]
สำหรับการเรนเดอร์ข้อมูล คุณสามารถทำได้ตามปกติ ถ้าคุณต้องการเรนเดอร์ข้อมูลแบบเป็นหน้าๆให้ใช้โค้ดแบบนี้:
<%= will_paginate @posts %>
Will_paginate จะคำนวนว่าต้องแสดงกี่ record ในแต่ละหน้าโดยเรียกใช้ method per_page สำหรับ model ที่คิวรี่มาได้ คุณสามารถสร้าง per_page ใน model ได้เช่น:
class Post < ActiveRecord::Base
cattr_reader :per_page
@@per_page = 50
end
… หรือจะทำแบบนี้ก็ได้:
class Post < ActiveRecord::Base
def self.per_page
50
end
end
ถ้าคุณไม่ได้ระบุ per_page ใน model ของคุณ WillPaginate จะใช้ค่า 30 เป็นค่าดีฟอล์ต แต่คุณสามารถเปลี่ยนค่านี้ตอนเรียกใช้ controller ได้:
@posts = Post.paginate :page => params[:page] || 1, :per_page => 50
paginate finder ทำหน้าที่ครอบ finder ตัวต้นฉบับไว้และคืน collection ที่มีคุณสมบัติพิเศษเพิ่มเติมนิดหน่อย คุณสามารถใช้ collection นี้เหมือนๆกับที่คุณใช้ผลลัพทธ์ของ ActiveRecord ปกติ หรือจะส่งไปให้ view helpers ของ WillPaginate เรนเดอร์ให้ก็ได้:
<% @posts.each do |post| -%>
- <%= link_to post.title, post %>
<% end -%>
===== แหล่งข้อมูลเพิ่มเติม =====
[[http://wiki.github.com/mislav/will_paginate/installation|ขั้นตอนการติดตั้งพร้อมตัวเลือกต่างๆแบบละเอียด]]
[[http://wiki.github.com/mislav/will_paginate|WillPaginate วิกิ]]
[[http://groups.google.com/group/will_paginate|กลุ่มผู้ใช้ will_paginate]]