Rails không sử dụng ERB của stdlib theo mặc định, nó sử dụng erubis . Nguồn: nhận xét của nhà phát triển này , gempec của ActionView , yêu cầu hợp nhất được chấp nhận mà tôi đã thực hiện trong khi viết này .
Có những khác biệt hành vi giữa chúng, đặc biệt là về cách các nhà khai thác gạch nối %-
và -%
làm việc.
Tài liệu khan hiếm, định dạng ERB của Ruby "chính thức" được định nghĩa ở đâu? Vì vậy, những gì sau đây là kết luận theo kinh nghiệm.
Tất cả các thử nghiệm giả sử:
require 'erb'
require 'erubis'
Khi nào bạn có thể sử dụng -
- ERB: bạn phải vượt qua
-
để trim_mode
lựa chọn ERB.new
để sử dụng nó.
- erubis: được bật theo mặc định.
Ví dụ:
begin ERB.new("<%= 'a' -%>\nb").result; rescue SyntaxError ; else raise; end
ERB.new("<%= 'a' -%>\nb" , nil, '-') .result == 'ab' or raise
Erubis::Eruby.new("<%= 'a' -%> \n b").result == 'a b' or raise
Có gì -%
không:
Ví dụ:
# Remove
ERB.new("a \nb <% 0 -%>\n c", nil, '-').result == "a \nb c" or raise
# Don't do anything: not followed by newline, but by space:
ERB.new("a\n<% 0 -%> \nc", nil, '-').result == "a\nb \nc" or raise
# Remove the current line because only whitesapaces:
Erubis::Eruby.new(" <% 0 %> \nb").result == 'b' or raise
# Same as above, thus useless because longer.
Erubis::Eruby.new(" <% 0 -%> \nb").result == 'b' or raise
# Don't do anything because line not empty.
Erubis::Eruby.new("a <% 0 %> \nb").result == "a \nb" or raise
Erubis::Eruby.new(" <% 0 %> a\nb").result == " a\nb" or raise
Erubis::Eruby.new(" <% 0 -%> a\nb").result == " a\nb" or raise
# Don't remove the current line because of `=`:
Erubis::Eruby.new(" <%= 0 %> \nb").result == " 0 \nb" or raise
# Remove the current line even with `=`:
Erubis::Eruby.new(" <%= 0 -%> \nb").result == " 0b" or raise
# Remove forward only because of `-` and non space before:
Erubis::Eruby.new("a <%= 0 -%> \nb").result == "a 0b" or raise
# Don't do anything because non-whitespace forward:
Erubis::Eruby.new(" <%= 0 -%> a\nb").result == " 0 a\nb" or raise
Có gì %-
không:
ERB: xóa các khoảng trắng trước thẻ và sau các dòng mới trước đó, nhưng chỉ khi chỉ có các khoảng trắng trước đó.
erubis: vô dụng vì <%- %>
giống như <% %>
(không có =
) và điều này không thể được sử dụng với =
trường hợp duy nhất -%
có thể hữu ích. Vì vậy, không bao giờ sử dụng này.
Ví dụ:
# Remove
ERB.new("a \n <%- 0 %> b\n c", nil, '-').result == "a \n b\n c" or raise
# b is not whitespace: do nothing:
ERB.new("a \nb <%- 0 %> c\n d", nil, '-').result == "a \nb c\n d" or raise
Làm gì %-
và -%
làm gì với nhau
Sự kết hợp chính xác của cả hai hiệu ứng riêng biệt.