ERB เป็นเครื่องมือสร้างเทมเพลต (templating engine)
เครื่องมือสร้างเทมเพลตช่วยให้คุณ ผสม HTML และ Ruby ได้ เพื่อสร้างเว็บเพจโดยใช้ข้อมูลจากฐานข้อมูล
ERB เป็นเครื่องมือเริ่มต้นของ Rails สำหรับการ render view
หมายเหตุ: Rails ใช้การนำไปปฏิบัติที่เรียกว่า erubi แทนคลาส
ERBจากไลบรารีมาตรฐานของ Ruby
như bạn sẽได้เรียนรู้ภายหลังในบทความนี้ คุณไม่จำเป็นต้องใช้ Rails เพื่อใช้ ERB
แต่ก่อน:
บทนำเกี่ยวกับไวยากรณ์ ERB วิธีใช้ ERB ในโปรเจกต์ Ruby และการเปรียบเทียบกับเครื่องมือสร้างเทมเพลตอื่นๆ เช่น HAML
มาเริ่มกันเลย!
บทเรียน Embedded Ruby (ERB)
เทมเพลต ERB คือไฟล์ที่ลงท้ายด้วย .html.erb หรือ .erb
ทุกสิ่งที่คุณเขียนในเทมเพลต ERB เป็น HTML
เว้นแต่… คุณใช้แท็กพิเศษ!
ตัวอย่าง:
Hello <%= name %>!
แท็ก <%= %> นี้จะถูกแทนที่โดยเครื่องมือสร้างเทมเพลตโดยการประเมินโค้ด Ruby ภายใน
เหมือน string interpolation!
สังเกตเครื่องหมายเท่ากับใน <%= %>
สิ่งนั้นบอก ERB ให้ render เนื้อหาของแท็กนี้
หากต้องการเขียนลูปหรือคำสั่ง if ใน ERB คุณต้องไม่ใส่เครื่องหมายเท่ากับ เพื่อให้ ERB ไม่ render สิ่งที่ไม่ต้องการ
คุณอาจได้ข้อผิดพลาดหากไม่ใช้แท็ก ERB ที่ถูกต้อง
ตัวอย่าง:
<% if @favorite_food == "chocolate" %> Are you a chocolate lover? Here are some of our best PREMIUM chocolate bars! <% else %> Here are our top 10 snacks that people bought this month. <% end %>
นี่คือ คำสั่ง if ของ ERB เหมือนคำสั่ง if ของ Ruby ทั่วไป แต่ห่อหุ้มด้วยไวยากรณ์เทมเพลตพิเศษ เพื่อให้สามารถประเมินและแทนที่ด้วยผลลัพธ์เมื่อหน้านี้ถูก render ให้ผู้ใช้
ตัวอย่างลูป ERB:
<% @books.each do |book| %> <%= book.title %> <%= book.author %>
<% end %>
เมื่อมีอาร์เรย์หนังสือ โค้ดนี้จะพิมพ์หนังสือทุกเล่มพร้อมขึ้นบรรทัดใหม่ระหว่างกัน
หากคุณใช้ Rails มันจะ render เทมเพลตนี้ให้คุณเมื่อคุณเรียก action ของ controller ที่เกี่ยวข้อง
ใช้ ERB โดยไม่ต้องมี Rails
หากต้องการใช้ ERB นอกเหนือจาก Rails เพื่อสร้างรายงานและเว็บไซต์สแตติก…
คุณสามารถทำได้:
require 'erb'
Book = Struct.new(:title, :author)
template = ERB.new(File.read('template.erb'))
template.result_with_hash(books: [Book.new("test"), Book.new("abc")])
คุณต้องแทนที่ @books ด้วย books ในเทมเพลตของคุณเพื่อให้ทำงานได้
Rails ใช้เทคนิค metaprogramming ที่เรียกว่า "variable binding"
นั่นคือวิธีที่ Rails แชร์ตัวแปรอินสแตนซ์จาก controller ของคุณกับเทมเพลต แต่หากคุณจะใช้ ERB โดยไม่มี Rails การใช้แฮช (กับเมธอด result_with_hash) เป็นวิธีที่สะอาดกว่า
คุณคิดอย่างไร?
เปรียบเทียบเครื่องมือสร้างเทมเพลต
ตอนนี้:
มาเปรียบเทียบเครื่องมือสร้างเทมเพลตต่างๆ กัน
คุณสามารถเข้าถึงเครื่องมือทั้งหมดเหล่านี้ผ่าน gem Tilt Tilt เป็น gem ตัวแปลงเหมือน Faraday
ตัวอย่าง:
require 'tilt'
Tilt::ErubiTemplate.new("test.erb").render
require 'tilt/haml'
Tilt::HamlTemplate.new("test.haml").render
require 'slim'
Slim::Template.new("test.slim").render
นี่คือ benchmark ระหว่างการนำไปปฏิบัติต่างๆ:
Comparison: erubi: 5786.0 i/s ERB: 4438.8 i/s - 1.30x slower Haml: 1340.0 i/s - 4.32x slower Slim: 724.1 i/s - 7.99x slower
นี่คือ ไวยากรณ์ HAML:
%head %title Ruby Templating Engines = 123 * 2 %body - foo.each do |bar| %p This Is Cool
มันต่างจาก HTML แบบธรรมดา ดังนั้นคุณต้องปรับตัวให้คุ้นเคย
แม้กระทั่ง ไวยากรณ์ Slim ก็กระชับกว่านี้:
head title Ruby Templating Engines = 123 * 2 body - foo.each do |bar| p | This Is Cool
Slim ใช้เครื่องหมายไพป์สำหรับบล็อกเนื้อหาหลายบรรทัด ใน Haml ไม่ต้องใช้
มาเปรียบเทียบที่ระดับ GitHub repository:
| REPO | STARS | LAST_COMMIT | LATEST_RELEASE | CREATED_DATE |
|---|---|---|---|---|
| jeremyevans/erubi | 255 | 2019-11-05 14:09:06 | 2019-09-25 15:44:36 | 2016-11-10 22:42:44 |
| haml/haml | 3461 | 2019-12-27 10:51:59 | 2019-08-06 12:01:09 | 2008-02-11 22:55:26 |
| slim-template/slim | 4898 | 2019-12-15 23:55:23 | 2018-09-02 23:54:10 | 2010-09-13 01:32:07 |
คุณควรใช้ตัวไหน?
ผมคิดว่ามันเป็นเรื่องของความชอบส่วนใหญ่
แต่สิ่งหนึ่งชัดเจน:
เลือกหนึ่งตัวสำหรับโปรเจกต์เฉพาะ และเขียนเทมเพลตทั้งหมดด้วยเครื่องมือตัวนั้น
อย่าผสมผสาน
ผมชอบใช้เทมเพลต ERB…
พร้อม editor snippets และการสนับสนุนที่เหมาะสม มันไม่ได้เพิ่มการเขียนมากนัก
คุณยังมี converter (จาก/ไป ERB) หากต้องการย้ายไปเครื่องมืออื่น
สรุป
คุณได้เรียนรู้เกี่ยวกับเครื่องมือสร้างเทมเพลตใน Ruby แล้ว!
กรุณาแชร์บทความนี้และสมัครรับจดหมายข่าวของผมหากยังไม่ได้ (9000+ ผู้สมัคร) เพื่อรับเนื้อหายอดเยี่ยมแบบนี้ต่อไป
ขอบคุณที่อ่าน 🙂