ผจญภัยใน will_paginate เพื่อเพิ่ม first_item ใน RailsSpace
ในโพสก่อนหน้าเกี่ยวกับการแบ่งหน้าใน RailsSpace ได้เขียนอัพเดตต่อท้ายว่าไปเจอตัวอย่างของบล๊อก RailsSpace ที่เจ๋งกว่าเพราะว่าเอาโค้ด first_item, last_item, ฯลฯ ไปไว้ใน class WillPaginate เลย ทำให้ไม่ต้องสร้างตัวแปรพิเศษใน view
ปัญหามันอยู่ที่ว่าไอ้โค้ดตัวอย่างในไฟล์ lib/will_paginate_ext.rb มันเหมือนจะไม่ถูกโหลดขึ้นมาใช้งานใน Rails 2.3 นี่สิ ไม่รู้ว่าคนอื่นเจอปัญหาเดียวกันหรือเปล่าแต่ว่าถ้าเอาโค้ดไปอยู่ในไฟล์นี้แล้วเรียกใช้ first_item จะเจอปัญหาว่า:
NoMethodError: undefined method `first_item' for #<WillPaginate::Collection:0x291ec20>
เลยลองแก้วิธีแรกด้วยการเปลี่ยนชื่อไฟล์เป็น will_paginate.rb แต่เจอปัญหาใหม่ว่า
Expected /Users/Tik/temp/rails_space/lib/will_paginate.rb to define WillPaginate
อันนี้ก็พอเข้าใจได้ เพราะตาม convention แล้ว Rails คงคาดหวังให้เรามี class ชื่อ WillPaginate ในไฟล์ will_paginate.rb เลยลองใหม่ คราวนี้เปลี่ยนชื่อไฟล์เป็น collection.rb แต่พอเปลี่ยนชื่อแล้วก็กลับไปเจอปัญหาแรกอีก นั่นคือ NoMethodError
จากนั้นก็ลองย้ายไฟล์อีกที เพราะคิดว่า Rails อาจจะอยากให้มีไดเร็คทอรี่สำหรับ will_paginate ก็ได้ เลยย้ายไฟล์ไปที่ lib/will_paginate/collection.rb แทน หลังแก้ครั้งนี้ปรากฏว่าเจอปัญหาใหม่แทน:
NoMethodError: undefined method `create' for WillPaginate::Collection:Class from /opt.../mislav-will_paginate-2.3.8.../finder.rb:76:in `paginate'
ฮืมมม … จากอาการคร่าวๆ ดูแล้วน่าจะเกิดจากการที่เรา define class นี้ใน collection.rb ทำให้ Ruby ใช้ class นี้แทนสิ่งที่อยู่ใน will_paginate gem (เสมือนว่าเราสร้าง class ชื่อเดียวกันขึ้นมาเองอีกหนึ่ง class และ class ที่เราสร้างไม่มี method ต่างๆที่ will_paginate ต้องการ)
ปัญหาโลกแตกที่รอคอยการแก้ไขต่อไป…เนื่องจากดึกแล้วนั่นเอง
[...] a comment » ในโพสก่อนหน้า [...]
ร้อยแปดพันเก้า ผจญภัยใน will_paginate เพื่อเพิ่ม first_item ใน RailsSpace (ต่อ) « Tik’s Blog
เมษายน 2, 2009 at 11:49 pm