หน้าเว็บ

วันศุกร์ที่ 29 กรกฎาคม พ.ศ. 2559

การเรียกใช้ render พร้อมกับส่ง instance ของโมเดล





สมมติว่าเรามีโมเดล Book และ Review ที่ associate กันอยู่
แล้วเราต้องการแสดงข้อมูลใน Review จากหน้า show ของ Book โดยโค้ดของหน้า show มีหน้าตาประมาณนี้
/app/views/books/show.html.erb


<$= render @book.reviews %>
เมื่อใช้ render แบบนี้ สิ่งที่เกิดขึ้นคือ

  1. ไฟล์ partial ของ Review จะถูกเรียกขึ้นมารัน เพราะมีการใส่ argument เป็น instance ของโมเดล Reviews ลงไป (ซึ่งก็คือ @book.reviews) ในที่นี้ไฟล์ partial ที่ถูเรียกจะเป็น /app/views/reviews/_review.html.erb
  2. Rails จะสร้างตัวแปร local ที่มีชื่อดียวกับ partial เอาไว้โดยอัตโนมัติ (ไม่นับเครื่องหมายขึดล่าง ในที่นี้ไฟล์ partial ชื่อ _review.html.erb จะมีตัวแปรชื่อ review) ค่าของตัวแปร local ที่ Rails สร้างขึ้นจะอ้างอิงไปยัง instance ของโมเดลที่ใส่เข้ามาตอนเรียกใช้ render (ในที่นี้ก็คือ อ็อบเจกต์ @book.reviews ซึงเป็น instance ของโมเดล Review )
การแสดงผลในไฟล์ partial จึงเขียนออกมาได้แบบนี้

/app/views/reviews/_review.html.erb
<%= review.rating %>
<%= review.rating %>

รายละเอียดเพิ่มเติมอยู่ในหัวข้อ 3.4.4 Passing Local Variables จากหน้า Rails Guide - Layout and Randering ครับ

วันอังคารที่ 19 กรกฎาคม พ.ศ. 2559

ลองใช้เมธอดใน ActionView::Helpers จาก rails console



ActionView::Helpers เป็นโมดูลที่มีเมธอดที่เกี่ยวกับการแสดงผลใน view อยู่เยอะมาก แต่ละเมธอดนี่มีลักษณะเป็น “Magic” แทบทั้งนั้น
ผมเป็นคนนึงแหละที่ไม่คุ้น และไม่ค่อยชอบเท่าไหร่กับความเป็น “Magic” ที่ถูกออกแบบมาแบบนั้น เอาซะเลย
เกิดความรู้สึกอึดอัดทุกครั้งที่จะเรียกใช้เมธอดแต่ละที ถึงแม้ว่ามันจะเป็นเมธอดง่ายๆ อย่าง link_to หรือ image_tag ก็ตาม
แต่ทำไงได้ ถ้าคิดจะใช้ Rails เราก็หนีไม่พ้นที่จะต้องเรียกใช้เมธอดเหล่านี้ อย่างหลีกเลี่ยงไม่ได้

ทางที่ดีที่สุดก็คือเข้าไปทำความเข้าใจกับมันเลยดีกว่า ว่าเมธอดพวกนี้ทำงานยังไง เข้าไปค้นหาความจริงว่ามีอะไรเกิดขึ้นบ้างเมื่อ Magic ถูกเรียกใช้

มีความรู้สึกว่า คิดถูกแล้ว ที่ยอมเสียเวลาค้นหาความจริง เพราะว่าหลังจากที่ไปไล่ดู document ใน api.rubyonrails.org ก็พบว่า document นั้นทำไว้ค่อนข้างดีถึงดีมาก มีคำอธิบายรายละเอียดพร้อมตัวอย่างของแต่ละเมธอดไว้ครบถ้วน

ไล่ดูไปเรื่อยๆ กลับรู้สึกว่า Magic มันไม่ได้เลวร้ายอย่างที่คิด เรากลับคิดว่าเมธอดที่เขาออกแบบมามันกลับดูดี มีเหตุมีผลไปซะงั้น

เมฆหมอกของความกลัวและความไม่รู้ ค่อยๆ จางลงไป ความเข้าใจค่อยๆ เข้ามาแทนที่

พอค้นคว้าเพิ่มอีกเล็กน้อยก็รู้ว่าเราสามารถ ทดลองเล่น ทดลองใช้ เมธอดพวกนี้ผ่านทาง Rails Console ได้เลย โดยใช้เรียกใช้ผ่านอ็อบเจกต์ helper ดังตัวอย่างด้านล่าง

$rails console
Loading development environment (Rails 5.0.0)
irb(main):001:0> helper.tag("br")
=> "
"
irb(main):002:0>


อีกตัวอย่างที่ผมทดลองเล่นใน console โดยลองเพิ่ม srcet เข้าไปเวลาเรียกใช้เมธอด image_tag ซึ่งทำแบบถึกๆ ได้ดังนี้

irb(main):017:0>helper.image_tag(“photo.jpg”, {class: “photo”, srcset: "#{helper.image_path("photo-small.jpg")} 480w"})
=> "< img class=\"photo\" srcset=\"/images/photo-small.jpg 480w\" src=\"/images/photo.jpg\" alt=\"Photo\" />"
irb(main):018:0>


ลองเล่นดูนะครับ

วันอาทิตย์ที่ 8 พฤษภาคม พ.ศ. 2559

แก้ปัญหารันคำสั่ง rails แล้วเจอ error ว่า TZInfo::DataSourceNotFound

วันนี้เจอปัญหาสั่ง rails server แล้วขึ้น error "TZInfo::DataSourceNotFound"
เราใช้ Rails 4.1.15, Ruby 2.1.7

หลังจากหาข้อมูลในกูเกิล ก็เจอวิธีแก้ไขจาก กระทู้บน stackoverflow อันนี้

ปัญหาเกิดจากการที่เราให้ windows 64bits ซึ่ง ไม่มีข้อมูลของ zoneinfo ที่ gem tzinfo-data เรียกหา
วิธีการแก้ไขทำได้โดยการใส่ :x64_mingw ลงไปเพื่อบอก tzinfo-data ว่าเราใช้ windows 64 bits ซึ่งตรงนี้ทำได้โดยการแก้ไขบรรทัดที่มีการเรียก tzinfo-data ใน Gemfile โดยแก้ให้เป็น

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw]

จากนั้นให้รัน bundle update ก็เป็นอันเรียบร้อย