====== การแบ่งหน้าด้วย 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| -%>
  1. <%= link_to post.title, post %>
  2. <% 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]]