Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญ Ruby Templating: ERB, HAML และ Slim แสดงความเข้าใจ

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+ ผู้สมัคร) เพื่อรับเนื้อหายอดเยี่ยมแบบนี้ต่อไป

ขอบคุณที่อ่าน 🙂