Qual é a diferença entre <%, <% =, <% # e -%> no ERB no Rails?

368

Alguém pode descrever o uso dos seguintes caracteres usados ​​no arquivo ERB:

<%   %>
<%=  %>
<%  -%>
<%#  %>

qual é o uso de cada um?

simo
fonte
11
Você tem ótimas respostas aqui. Observe também que Haml é frequentemente uma alternativa superior ao ERb.
Marnen Laibow-Koser
11
Sim, é muito mais fácil de lidar do que ERb
simo
11
possível duplicata da diferença entre -%> e%> nos trilhos para -%>e stackoverflow.com/questions/3952403/… para <%=, stackoverflow.com/questions/3901619/… para <%#.
Ciro Santilli escreveu
@ Santiro Santiro: Apesar da idade, este parece mais completo que suas referências. Estou votando para fechá-los como burros deste ..
Brad Werth 02/09
<%= %>e <%= -%>são diferentes: somente o último remove os espaços em branco à direita.
Ilusionista #

Respostas:

476
<% %>

Executa o código ruby ​​entre colchetes.

<%= %>

Imprime algo no arquivo erb.

<% -%>

Evita quebra de linha após a expressão.

<%# %>

Comentários fora do código entre colchetes; não enviado ao cliente (em oposição aos comentários em HTML).

Visite Ruby Doc para obter mais informações sobre o ERB.

auralbee
fonte
17
eu encontrei em algum lugar no código essa variante mais <% ==%> alguém sabe o que é?
okliv 11/07/12
38
O duplo igual significa que a cadeia não é escapada, como em bruto.
22414 Richard_G
7
O Rails não usa o stdlib ERB: usa erubis: github.com/rails/rails/issues/16766#issuecomment-54148778
Ciro Santilli
3
Mas ... mas ... <%#é apenas normal <%com um comentário de Ruby #logo após ... Sim, é divertido pensar que é algo especial, mas não é apenas um idioma do ERB e não uma construção sintática especial?
BalinKingOfMoria Reinstate CMs
6
@QPaysTaxes desculpe por isso, você está certo ... Por exemplo, se você possui ERB com várias linhas <%...%>, <%#...%>comenta tudo , o que não faria se fosse apenas um comentário normal (ou seja, apenas comentaria a linha está ligado).
BalinKingOfMoria Reinstala CMs 11/01
86

<% %>e <%- and -%>são para qualquer código Ruby, mas não gera os resultados (por exemplo, instruções if). os dois são iguais.

<%= %> é para gerar os resultados do código Ruby

<%# %> é um comentário do ERB

Aqui está um bom guia: http://api.rubyonrails.org/classes/ActionView/Base.html

yalestar
fonte
Não vejo que a abertura <%-faça alguma coisa para colocar espaços em branco, e não a vejo documentada em lugar algum. Você tem certeza sobre isso? Talvez seja um sabor diferente do ERB. Não há opção mostrada para ele nos documentos stdlib.
Andrew Vit
11
@AndrewVit - Na página mencionada nesta resposta (página dos documentos ActionView :: Base): "<% - e -%> suprimem os espaços em branco à esquerda e à direita, incluindo a nova linha à direita, e podem ser usados ​​de forma intercambiável com <% e%>. "
Earl Jenkins
5
Como suprimir espaços em branco à esquerda para <% =%>?
Bogdan Gusiev
52

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_modeopção de ERB.newusá-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:

  • ERB: remova o próximo caractere se for uma nova linha.

  • erubis:

    • em <% %>(sem =), -é inútil porque <% %>e <% -%>é o mesmo. <% %>remove a linha atual se ela contiver apenas espaços em branco e não fizer nada de outra maneira.

    • em <%= -%>(com =):

      • remova a linha inteira se ela contiver apenas espaços em branco
      • caso contrário, se houver um espaço não antes da tag, e somente whitesapces depois, remova os whitespces que vêm depois
      • caso contrário, existe um não-espaço após a tag: não faça nada

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.

Ciro Santilli adicionou uma nova foto
fonte
11
Na segunda linha, você escreveu que o Rails usa eruby enquanto vincula a erubis.
Daniel Jonsson
11
@ DanielJonsson, obrigado pelo relatório: era para ser erubis. Enlouquecendo com tantas versões. Atualizada.
Ciro Santilli publicou
10
  • <% %> : Executa o código ruby
  • <%= %>: Imprime no arquivo Erb. Ou navegador
  • <% -%> : Evita quebra de linha após a expressão.
  • <%# %> : Comentário do ERB
Neha Nakrani
fonte
7

Eu adicionei o <%%delimitador de tag literal como resposta a isso devido à sua obscuridade. Isso instruirá o erb a não interpretar a <%parte da tag necessária para aplicativos js, como exibir dicas de ferramentas chart.js etc.

Atualização (link quebrado fixo)

Tudo sobre o ERB agora pode ser encontrado aqui: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags

bkunzi01
fonte
11
este link atende o OP com precisão
Ben Tinsley
Link agora está quebrado
andreofthecape
Atualizado com o novo link!
precisa saber é o seguinte
3

Estes são usados ​​em rubi sobre trilhos : -

<%%>: -

As tags <%%> são usadas para executar o código Ruby que não retorna nada, como condições, loops ou blocos. Por exemplo :-

<h1>Names of all the people</h1>
<% @people.each do |person| %>
  Name: <%= person.name %><br>
<% end %>

<% =%>: -

use para exibir o conteúdo.

Name: <%= person.name %><br>

<% -%>: -

O Rails estende o ERB, para que você possa suprimir a nova linha simplesmente adicionando um hífen à direita às tags nos modelos do Rails

<% #%>: -

comente o código

<%# WRONG %>
Hi, Mr. <% puts "Frodo" %>
HeadAndTail
fonte
1

<% %>executa o código lá, mas não imprime o resultado, por exemplo:
Podemos usá-lo para se mais em um arquivo erb.

<% temp = 1 %>
<% if temp == 1%>
  temp is 1
<% else %>
  temp is not 1
<%end%>  

Vai imprimir temp is 1


<%= %>executa o código e também imprime a saída, por exemplo:
Podemos imprimir o valor de uma variável rails.

<% temp = 1 %>
<%= temp %>  

Vai imprimir 1


<% -%>Não faz diferença, pois não imprime nada, -%>apenas faz sentido com <%= -%>, isso evitará uma nova linha.


<%# %> comentará o código escrito dentro disso.

Aastha Kesarwani
fonte