ERB เป็นเครื่องมือสร้างเทมเพลต
เครื่องมือสร้างเทมเพลตช่วยให้คุณ ผสม HTML และ Ruby เพื่อให้คุณสามารถสร้างหน้าเว็บโดยใช้ข้อมูลจากฐานข้อมูลของคุณ
ERB เป็นเครื่องมือเริ่มต้นของ Rails สำหรับการแสดงมุมมอง
หมายเหตุ:Rails ใช้การนำไปใช้ที่เรียกว่า erubi แทน
ERB
จากไลบรารีมาตรฐาน Ruby
คุณจะได้เรียนรู้ในภายหลังในบทความนี้ คุณไม่จำเป็นต้องมี Rails เพื่อใช้ ERB
แต่ก่อน :
ข้อมูลเบื้องต้นเกี่ยวกับไวยากรณ์ของ ERB วิธีใช้ ERB ในโครงการ Ruby ของคุณและวิธีเปรียบเทียบกับเอ็นจิ้นการสร้างเทมเพลตอื่นๆ เช่น HAML
มาทำสิ่งนี้กันเถอะ!
การสอนทับทิมฝังตัว (ERB)
เทมเพลต ERB เป็นไฟล์ที่ลงท้ายด้วย .html.erb
หรือ .erb
ส่วนขยาย
ทุกสิ่งที่คุณเขียนในเทมเพลต ERB จะเป็น HTML
เว้นแต่… คุณใช้แท็กพิเศษ!
นี่คือตัวอย่าง :
Hello <%= name %>!
<%= %>
. นี้ แท็กจะถูกแทนที่ด้วยเอ็นจิ้นการสร้างเทมเพลตโดยการประเมินโค้ด Ruby ที่อยู่ภายใน
มันเหมือนกับการแก้ไขสตริง!
สังเกตเครื่องหมายเท่ากับ <%= %>
.
ที่บอกให้ ERB แสดงเนื้อหาของแท็กนี้ .
หากคุณต้องการเขียนคำสั่งวนซ้ำหรือ if ใน ERB คุณต้องการตัดเครื่องหมายเท่ากับออกเพื่อไม่ให้ ERB แสดงผลสิ่งที่คุณไม่ต้องการ
คุณอาจได้รับข้อผิดพลาดหากไม่ได้ใช้แท็ก 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 %>
นี่คือ ERB if statement เช่นเดียวกับคำสั่ง Ruby if ปกติ แต่ล้อมรอบไวยากรณ์เทมเพลตพิเศษเพื่อให้สามารถประเมิน &แทนที่ด้วยผลลัพธ์เมื่อแสดงผลหน้านี้สำหรับผู้ใช้
นี่คือการวนรอบ ERB :
<% @books.each do |book| %> <%= book.title %> <%= book.author %>
<% end %>
เมื่อมีหนังสือหลายเล่ม ระบบจะพิมพ์หนังสือทุกเล่มโดยมีตัวแบ่งบรรทัดระหว่างหนังสือ
หากคุณใช้ Rails เทมเพลตนี้จะแสดงเทมเพลตนี้ให้คุณทราบเมื่อคุณเรียกใช้การดำเนินการควบคุมที่เกี่ยวข้อง
การใช้ 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 แชร์ตัวแปรอินสแตนซ์จากคอนโทรลเลอร์ของคุณกับเทมเพลตของคุณ แต่ถ้าคุณจะใช้ ERB โดยไม่มี Rails โดยใช้แฮช (พร้อม result_with_hash
วิธี) เป็นวิธีที่สะอาดกว่า
คุณคิดอย่างไร?
การเปรียบเทียบเครื่องมือสร้างแม่แบบ
ตอนนี้ :
มาเปรียบเทียบเครื่องมือสร้างเทมเพลตต่างๆ กัน
คุณสามารถเข้าถึงเอ็นจิ้นเหล่านี้ทั้งหมดได้โดยใช้ Tilt gem Tilt เป็นอัญมณีอะแดปเตอร์เช่น 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
นี่คือเกณฑ์มาตรฐานระหว่างการใช้งานต่างๆ :
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:
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 |
แบบบาง/แบบบาง | 4898 | 2019-12-15 23:55:23 | 2018-09-02 23:54:10 | 2010-09-13 01:32:07 |
คุณควรใช้อันไหน?
ฉันคิดว่ามันเป็นความชอบส่วนบุคคลเป็นส่วนใหญ่
แต่สิ่งหนึ่งที่ชัดเจน :
เลือกหนึ่งรายการสำหรับโปรเจ็กต์เฉพาะและเขียนเทมเพลตทั้งหมดของคุณโดยใช้เอ็นจิ้นนั้น
ห้ามมิกซ์แอนด์แมทช์
ฉันชอบใช้เทมเพลต ERB…
ด้วยข้อมูลโค้ดบรรณาธิการที่ถูกต้องและการสนับสนุน จึงไม่เป็นการเขียนที่พิเศษมากนัก
คุณยังมีตัวแปลงที่พร้อมใช้งาน (จาก/เป็น ERB) หากคุณต้องการย้ายไปยังเครื่องมืออื่น
สรุป
คุณได้เรียนรู้เกี่ยวกับเครื่องมือสร้างเทมเพลตใน Ruby แล้ว!
โปรดแบ่งปันบทความนี้และสมัครรับจดหมายข่าวของฉันหากคุณยังไม่ได้ (สมาชิกมากกว่า 9000 คน) เพื่อรับเนื้อหาที่ยอดเยี่ยมเช่นนี้
ขอบคุณที่อ่านนะคะ 🙂