หน้าเว็บ

วันศุกร์ที่ 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 ก็เป็นอันเรียบร้อย

วันจันทร์ที่ 12 มกราคม พ.ศ. 2558

Ruby Weekly จดหมายข่าว รายสัปดาห์

Ruby Weekly เป็นข่าวรายสัปดาห์ทาง email ซึ่งผมเป็นสมาชิกอยู่ซักพักใหญ่ๆ ละ มีข่าวสารอัพเดต, Tip, Blogpost เรื่องเกี่ยวกับ Ruby และยังรวมถึงตำแหน่งงานว่างสำหรับ Ruby developer ด้วย

ผมว่ามันเป็นจดหมายข่าวที่ดีทีเดียวเลย

เพื่อนๆ สามารถเข้าไป subscribe ได้ฟรีตาม link นี้ครับ

นอกจาก Ruby Weekly แลัว ยังมีจดหมายข่าวของสาย web app อื่นๆ ให้ subscribe ด้วยเช่น HTML5, javascript รับประกันคถณภาพโดยคุณ Peter Cooper คนดัง สะใจกันไปเลย

วันอังคารที่ 28 ตุลาคม พ.ศ. 2557

โชว์ข้อมูลดีบักสำหรับ Rails

เราสามารถเรียกดูข้อมูลในตัวแปรต่างๆ ที่ใช้อยู่ใน Rails ได้โดยใช้เมธอดพิเศษของ Rails ซึ่งมีอยู่ 3 เมธอด ได้แก่


1. เมธอด debug
2. เมธอด to_yaml
3. เมธอด inspect

ทั้งสามแบบใช้งานคล้ายๆ กัน โดยเราสามารถเรียกใช้เมธอดนี้แล้วใส่ตัวแปรที่เราอยากตรวจสอบลงไปเป็น argument โดย debug และ to_yaml จะให้ผลลัพธ์คล้ายๆ กันจะต่างกันตรงที่ข้อมูลของตัวแปรที่เราตรวจสอบด้วย to_yaml จะอยู่ใน format ของ yaml เลย ในขณะที่ debug จะเป็นข้อความที่จัดเรียงให้อ่านง่ายกว่า ส่วน inspect นั้น ให้ผลลัพธ์เหมือนกับที่เราใช้ inspect ใน Ruby เลย

วิธีการนำไปใช้ก็ง่ายมาก คือเราสามารถเรียกเมธอดทั้ง 3 ตัวนี้ได้จาก view (ไฟล์ .html.erb) แล้วให้มันแสดงผลออกมาทางหน้าเพจเลย

<!DOCTYPE html>
<html>
<head>
  <title>Depot</title>
  <%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>
<%= debug(params) %>
</body>
</html>



จากโค้ดตัวอย่าง เราเรียกเมธอด debug จากหน้า layout (ไฟล์ app/views/application.html.erb) โดยตัวแปรที่เราต้องการตรวจสอบในที่นี้คือ param
ผลลัพธ์ที่ได้จะเป็นข้อความดีบัก ซึ่งมีหน้าตาประมาณนี้



ลองใช้ดูละกันครับ