หน้าเว็บ

วันอังคารที่ 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
ผลลัพธ์ที่ได้จะเป็นข้อความดีบัก ซึ่งมีหน้าตาประมาณนี้



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

วันพฤหัสบดีที่ 9 ตุลาคม พ.ศ. 2557

Method lookup และ super

ทุ
กครั้งที่ message ถูกส่งไปยังผู้รับ (receiver) Ruby จะทำการตรวจสอบทันทีว่าภายในคลาสต้นสังกัดของอ็อบเจกต์ที่เป็นผู้รับ message นั้นมีเมธอดที่มีชื่อเดียวกันกับชื่อของ message ที่ถูกส่งเข้ามาหรือไม่
กระบวนการค้นหาเมธอดที่มีชื่อเดียวกับ message นั้น หากค้นหากันภายในคลาสของผู้รับแล้วไม่เจอเมธอดที่มีชื่อเดียวกับ message Ruby จะทำการค้นหาต่อไปยัง โมดูลที่คลาสนั้นผนวก (include) เข้ามา รวมถึงคลาสแม่ทุกๆ คลาสที่สืบทอดต่อกันมา เรื่อยไปขึ้นไปจนถึงคลาส BasicObject ซึ่งเป็นคลาสแม่ลำดับบนสุดของทุกๆ คลาส กันเลยทีเดียว 
เรื่องของลำดับขั้นในการค้นหาเมธอดของอ็อบเจกต์เมื่อตัวมันได้รับ message นั้นถือว่ามีความสำคัญไม่น้อย เพราะนอกจากจะช่วยให้เราแยกแยะการทำงานของอ็อบเจกต์และเมธอดได้แล้ว ยังช่วยให้เราเข้าใจถึงการ override ของ Ruby อีกด้วย

สมมติว่าเรากำหนดให้คลาส A, คลาส B และ โมดูล M มีความสัมพันธ์กันตามโค้ดต่อไปนี้

module M
  def print
    puts “this is print method”
  end
end

class A
  include M