ERB là một движок template (template engine).
Template engine cho phép bạn trộn HTML và Ruby để tạo trang web sử dụng dữ liệu từ database.
ERB là engine mặc định của Rails để render view.
Lưu ý: Rails dùng implementation gọi là erubi thay vì class
ERBtừ thư viện chuẩn Ruby.
Như bạn sẽ học sau, bạn không cần Rails để dùng ERB.
Nhưng trước hết:
Giới thiệu về cú pháp ERB, cách dùng ERB trong dự án Ruby và so sánh với các engine khác như HAML.
Bắt đầu nào!
Hướng dẫn Embedded Ruby (ERB)
Một ERB template là file kết thúc bằng đuôi .html.erb hoặc .erb.
Mọi thứ bạn viết trong ERB template là HTML.
Trừ khi… bạn dùng tag đặc biệt!
Ví dụ:
Hello <%= name %>!
Tag <%= %> này sẽ được template engine thay thế bằng cách evaluate code Ruby bên trong.
Giống như string interpolation!
Chú ý dấu bằng trong <%= %>.
Đó báo cho ERB render nội dung tag này.
Nếu muốn viết vòng lặp hoặc câu lệnh if trong ERB, bạn bỏ dấu bằng để ERB không render thứ không cần.
Bạn thậm chí có thể gặp lỗi nếu không dùng đúng tag ERB.
Ví dụ:
<% 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 %>
Đây là câu lệnh if ERB, giống if Ruby bình thường nhưng bọc trong cú pháp template đặc biệt để được evaluate và thay thế bằng output khi render trang cho user.
Ví dụ vòng lặp ERB:
<% @books.each do |book| %> <%= book.title %> <%= book.author %>
<% end %>
Cho một mảng sách, này sẽ in mỗi sách với line break giữa chúng.
Nếu bạn dùng Rails, nó sẽ render template này khi bạn gọi controller action liên quan.
Dùng ERB không cần Rails
Nếu muốn dùng ERB ngoài Rails để xây dựng báo cáo và trang web tĩnh…
Bạn có thể làm:
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")])
Bạn cần thay @books bằng books trong template để hoạt động.
Rails dùng thủ thuật metaprogramming gọi là "variable binding".
Đó là cách Rails chia sẻ instance variable từ controller với template. Nhưng nếu dùng ERB không qua Rails, dùng hash (với phương thức result_with_hash) là giải pháp sạch hơn.
Bạn nghĩ sao?
So sánh các Template Engine
Bây giờ:
Hãy so sánh các template engine khác nhau.
Bạn có thể truy cập tất cả engine này qua gem Tilt. Tilt là adapter gem như Faraday.
Ví dụ:
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
Đây là benchmark giữa các implementation:
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
Đây là cú pháp HAML:
%head
%title Ruby Templating Engines
= 123 * 2
%body
- foo.each do |bar|
%p This Is Cool
Khác với HTML thuần, bạn cần quen dần.
Ngắn gọn hơn nữa là cú pháp Slim:
head
title Ruby Templating Engines
= 123 * 2
body
- foo.each do |bar|
p
| This Is Cool
Slim dùng ký tự pipe cho block nội dung đa dòng, Haml không cần điều đó.
Hãy xem so sánh ở cấp độ 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 |
Nên dùng cái nào?
Tôi nghĩ chủ yếu là sở thích cá nhân.
Nhưng một điều rõ ràng:
Chọn một cho dự án cụ thể và viết tất cả template dùng engine đó.
Đừng trộn lẫn.
Tôi thích dùng ERB template…
Với snippet và hỗ trợ editor phù hợp thì không tốn nhiều công sức hơn.
Bạn thậm chí có converter (từ/đến ERB) nếu muốn chuyển engine khác.
Tóm tắt
Bạn đã học về template engine trong Ruby!
Hãy chia sẻ bài viết và đăng ký newsletter nếu chưa (9000+ subscriber) để nhận thêm nội dung hay như này.
Cảm ơn đã đọc 🙂