O Rails não usa o ERB do stdlib por padrão, ele usa erubis . Fontes: o comentário deste desenvolvedor , o gemspec do ActionView , aceitou a solicitação de mesclagem que eu fiz enquanto escrevia isso .
Não são diferenças de comportamento entre eles, em especial sobre a forma como os operadores hífen %-
e -%
trabalho.
A documentação é escassa. Onde o formato ERB do Ruby é "oficialmente" definido? então o que se segue são conclusões empíricas.
Todos os testes supõem:
require 'erb'
require 'erubis'
Quando você pode usar -
- ERB: você deve passar
-
para a trim_mode
opção de ERB.new
usá-lo.
- erubis: ativado por padrão.
Exemplos:
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
O que -%
faz:
Exemplos:
# 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
O que %-
faz:
ERB: remova os espaços em branco antes da tag e após as novas linhas anteriores, mas somente se houver apenas espaços em branco antes.
erubis: inútil porque <%- %>
é o mesmo que <% %>
(sem =
), e isso não pode ser usado com o =
qual é o único caso em que -%
pode ser útil. Portanto, nunca use isso.
Exemplos:
# 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
O que %-
e -%
fazer juntos
A combinação exata de ambos os efeitos separadamente.