Qual è la differenza tra <%, <% =, <% # e -%> in ERB in Rails?


368

Qualcuno può descrivere l'uso dei seguenti caratteri utilizzati nel file ERB:

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

a che serve ognuno?


1
Hai delle ottime risposte qui. Si noti inoltre che Haml è spesso un'alternativa superiore a ERb.
Marnen Laibow-Koser,

1
Sì, è molto più facile da gestire rispetto a ERb
simo


@Ciro Santilli: nonostante l'età, questo sembra più completo delle tue referenze. Sto votando per chiudere quelli come ingannevoli di questo ...
Brad Werth,

<%= %>e <%= -%>sono diversi: solo quest'ultimo rimuove gli spazi bianchi finali.
illusionista,

Risposte:


476
<% %>

Esegue il codice rubino tra parentesi.

<%= %>

Stampa qualcosa nel file erb.

<% -%>

Evita l'interruzione di riga dopo l'espressione.

<%# %>

Commenta il codice tra parentesi; non inviato al client (al contrario dei commenti HTML).

Visitare Ruby Doc per maggiori informazioni su ERB.


17
ho incontrato da qualche parte nel codice questa variante altrimenti <% ==%> qualcuno sa che cos'è?
Okliv,

38
Il doppio uguale significa che la stringa non viene salvata, come in raw.
Richard_G,


3
Ma ... ma ... <%#è solo normale <%con un commento di Ruby #subito dopo ... Sì, è divertente pensare che sia qualcosa di speciale, ma non è solo un linguaggio ERB piuttosto che un costrutto sintattico speciale?
BalinKingOfMoria Ripristina CM

6
@QPaysTaxes mi dispiace, hai ragione ... Ad esempio, se hai un ERB multilinea <%...%>, <%#...%>commenta tutto , cosa che non farebbe se fosse solo un normale commento (cioè commenterebbe solo la riga e 'acceso).
BalinKingOfMoria Ripristina CM

86

<% %>e <%- and -%>sono per qualsiasi codice Ruby, ma non genera i risultati (ad es. se le istruzioni). i due sono uguali.

<%= %> serve per trasmettere i risultati del codice Ruby

<%# %> è un commento ERB

Ecco una buona guida: http://api.rubyonrails.org/classes/ActionView/Base.html


Non vedo che l'apertura <%-faccia qualcosa per i principali spazi bianchi, e non la vedo documentata da nessuna parte. Sei sicuro di questo? Forse è un sapore diverso di ERB. Non c'è alcuna opzione mostrata per questo nei documenti stdlib.
Andrew Vit,

1
@AndrewVit - Dalla pagina a cui fa riferimento questa risposta (pagina Documenti di ActionView :: Base): "<% - e -%> sopprime gli spazi bianchi iniziali e finali, inclusa la nuova riga finale, e può essere utilizzato in modo intercambiabile con <% e%>. "
Earl Jenkins,

6
Come sopprimere i principali spazi bianchi per <% =%>?
Bogdan Gusiev,

52

Rails non utilizza ERB di stdlib per impostazione predefinita, utilizza erubis . Fonti: il commento di questo sviluppatore , il gemspec di ActionView , ha accettato la richiesta di unione che ho fatto mentre scrivevo questo .

Ci sono differenze di comportamento tra loro, in particolare su come gli operatori trattino %-e-% lavoro.

La documentazione è scarsa, dove viene definito "ufficialmente" il formato ERB di Ruby?quindi ciò che segue sono conclusioni empiriche.

Tutti i test suppongono:

require 'erb'
require 'erubis'

Quando puoi usare -

  • ERB: si deve passare -alla trim_modepossibilità diERB.new usarlo.
  • erubis: abilitato di default.

Esempi:

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

Cosa -%fa:

  • ERB: rimuove il carattere successivo se si tratta di una nuova riga.

  • erubis:

    • in <% %>(senza =), -è inutile perché <% %>e <% -%>sono gli stessi. <% %>rimuove la riga corrente se contiene solo spazi bianchi e non fa diversamente.

    • in <%= -%>(con =):

      • rimuovere l'intera riga se contiene solo spazi bianchi
      • altrimenti, se c'è un non-spazio prima del tag e solo i bianchi dopo, rimuovi i bianchi che seguono
      • altrimenti, dopo il tag c'è un non-spazio: non fare nulla

Esempi:

# 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

Cosa %-fa:

  • ERB: rimuove gli spazi bianchi prima del tag e dopo le nuove righe precedenti, ma solo se prima c'erano solo gli spazi bianchi.

  • erubis: inutile perché <%- %>è uguale a <% %>(senza =), e questo non può essere usato con il =quale è l'unico caso in cui -%può essere utile. Quindi non usarlo mai.

Esempi:

# 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

Cosa %-e -%fare insieme

La combinazione esatta di entrambi gli effetti separatamente.


1
Nella seconda riga hai scritto che Rails usa eruby mentre si collega a erubis.
Daniel Jonsson,

1
@DanielJonsson grazie per il rapporto: doveva essere erubico. Impazzire con così tante versioni. Aggiornato.
Ciro Santilli 11 冠状 病 六四 事件 法轮功

10
  • <% %> : Esegue il codice ruby
  • <%= %>: Stampa nel file Erb. O browser
  • <% -%> : Evita l'interruzione di riga dopo l'espressione.
  • <%# %> : Commento ERB

7

Ho aggiunto il <%%delimitatore di tag letterale come risposta a questo a causa della sua oscurità. Questo dirà a ERB di non interpretare il file<% parte del tag che è necessaria per le app js come la visualizzazione di tooltip chart.js ecc.

Aggiornamento (collegamento interrotto fisso)

Tutto su ERB ora può essere trovato qui: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags


1
questo collegamento risponde accuratamente al PO
Ben Tinsley,

Il link ora è rotto
andreofthecape

Aggiornato con il nuovo link!
bkunzi01

3

Questi sono utilizzati in rubino su rotaie : -

<%%>: -

I tag <%%> vengono utilizzati per eseguire il codice Ruby che non restituisce nulla, come condizioni, loop o blocchi. Per esempio :-

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

<% =%>: -

utilizzare per visualizzare il contenuto.

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

<% -%>: -

Rails estende ERB, in modo da poter sopprimere la nuova riga semplicemente aggiungendo un trattino finale ai tag nei modelli di Rails

<% #%>: -

commentare il codice

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

1

<% %>esegue il codice lì dentro ma non stampa il risultato, ad esempio:
possiamo usarlo per se altro in un file erb.

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

Stamperà temp is 1


<%= %>esegue il codice e stampa anche l'output, ad esempio:
possiamo stampare il valore di una variabile rotaie.

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

Stamperà 1


<% -%>Non fa differenza in quanto non stampa nulla, -%>ha senso solo <%= -%>, questo eviterà una nuova riga.


<%# %> commenterà il codice scritto all'interno di questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.