Jaka jest różnica między <%, <% =, <% # i -%> w ERB w Railsach?

368

Czy ktoś może opisać użycie następujących znaków, które są używane w pliku ERB:

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

jaki jest pożytek z każdego z nich?

simo
źródło
1
Masz tutaj świetne odpowiedzi. Zauważ również, że Haml jest często lepszą alternatywą dla ERb.
Marnen Laibow-Koser
1
Tak, łatwiej jest sobie z tym poradzić niż ERb
podobnie
1
możliwy duplikat różnicy między -%> i%> w szynach dla -%>i stackoverflow.com/questions/3952403/... for <%=, stackoverflow.com/questions/3901619/... for <%#.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@Ciro Santilli: Mimo wieku ten wydaje się bardziej kompletny niż twoje referencje. Głosuję za ich zamknięciem jako duplikaty tego ...
Brad Werth,
<%= %>i <%= -%>są różne: tylko ta ostatnia usuwa końcowe białe znaki.
iluzjonista

Odpowiedzi:

476
<% %>

Wykonuje kod ruby ​​w nawiasach.

<%= %>

Drukuje coś w pliku erb.

<% -%>

Zapobiega łamaniu linii po wyrażeniu.

<%# %>

Komentuje kod w nawiasach; nie wysyłane do klienta (w przeciwieństwie do komentarzy HTML).

Odwiedź Ruby Doc, aby uzyskać więcej informacji o ERB.

auralbee
źródło
17
spotkałem się gdzieś w kodzie w tym wariancie <% ==%> czy ktoś wie co to jest?
okliv
38
Podwójna równość oznacza, że ​​łańcuch nie jest uciekany, jak na surowo.
Richard_G
7
Railsy nie używają standardowego ERB: używa erubis: github.com/rails/rails/issues/16766#issuecomment-54148778
Ciro Santilli 2 冠状 病 六四 事件 法轮功
3
Ale ... ale ... <%#to normalne <%z komentarzem Ruby #zaraz po nim ... Tak, fajnie jest myśleć, że to coś wyjątkowego, ale czy nie jest to tylko idiom ERB, a nie specjalna konstrukcja?
BalinKingOfMoria Przywróć CM
6
@QPaysTaxes przepraszam za to, masz rację ... Na przykład, jeśli masz wielowierszowy ERB <%...%>, <%#...%>komentuje to wszystko , czego nie zrobiłby, gdyby to był zwykły komentarz (tzn. Komentowałby tylko wiersz włączone).
BalinKingOfMoria Przywróć CM
86

<% %>i <%- and -%>dotyczą dowolnego kodu Ruby, ale nie generują wyników (np. instrukcje if). dwa są takie same.

<%= %> służy do wyprowadzania wyników kodu Ruby

<%# %> jest komentarzem ERB

Oto dobry przewodnik: http://api.rubyonrails.org/classes/ActionView/Base.html

Yalestar
źródło
Nie widzę, żeby otwieranie miało znaczenie <%-dla wiodących białych znaków i nigdzie nie widzę tego udokumentowane. Jesteś pewien? Może to inny smak ERB. W dokumentach stdlib nie ma takiej opcji.
Andrew Vit
1
@AndrewVit - ze strony wymienionej w tej odpowiedzi (strona ActionView :: Base docs): „<% - i -%> pomija początkowe i końcowe białe spacje, w tym końcowy znak nowej linii, i można ich używać zamiennie z <% i%>. „
Earl Jenkins,
5
Jak ukryć wiodące białe znaki dla <% =%>?
Bogdan Gusiev
51

Railsy domyślnie nie używają ERB stdlib , używa Erubisa . Źródła: Skomentuj ten Dev jest , gemspec actionView jest , akceptowaną seryjnej prośba zrobiłem pisząc to .

Tam różnice zachowania między nimi, w szczególności w zakresie sposobów operatorów myślników %-i -%pracy.

Dokumentacja jest niewystarczająca. Gdzie jest zdefiniowany oficjalnie format ERB Ruby?więc poniższe wnioski są empiryczne.

Wszystkie testy zakładają:

require 'erb'
require 'erubis'

Kiedy możesz użyć -

  • ERB: musisz przejść -do trim_modeopcjiERB.new korzystania z niego.
  • erubis: domyślnie włączone.

Przykłady:

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

Co -%robi:

  • ERB: usuń następny znak, jeśli jest to nowy wiersz.

  • erubis:

    • w <% %>(bez =), -jest bezużyteczne, ponieważ <% %>i <% -%>są takie same. <% %>usuwa bieżący wiersz, jeśli zawiera tylko białe znaki, i nie robi nic innego.

    • w <%= -%>(z =):

      • usuń cały wiersz, jeśli zawiera tylko białe znaki
      • w przeciwnym razie, jeśli przed tagiem znajduje się spacja i tylko białe znaki po, usuń białe znaki po
      • w przeciwnym razie po tagu występuje spacja: nic nie rób

Przykłady:

# 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

Co %-robi:

  • ERB: usuń białe spacje przed tagiem i po poprzednich znakach nowej linii, ale tylko jeśli wcześniej były tylko białe spacje.

  • erubis: bezużyteczny, ponieważ <%- %>jest taki sam jak <% %>(bez =) i nie można tego użyć w =tym przypadku, gdy jest to jedyny przypadek, w którym -%może być użyteczny. Więc nigdy tego nie używaj.

Przykłady:

# 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

Co %-i -%robić razem

Dokładna kombinacja obu efektów osobno.

Ciro Santilli
źródło
1
W drugim wierszu napisałeś, że Railsy używają erubii podczas łączenia z erubis.
Daniel Jonsson,
1
@DanielJonsson dziękuję za raport: to miał być erubis. Szaleństwo w tak wielu wersjach. Zaktualizowano
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
10
  • <% %> : Wykonuje kod ruby
  • <%= %>: Drukuje do pliku Erb. Lub przeglądarka
  • <% -%> : Zapobiega łamaniu linii po wyrażeniu.
  • <%# %> : Komentarz ERB
Neha Nakrani
źródło
7

Dodałem <%%dosłowny separator znaczników jako odpowiedź na to z powodu jego niejasności. Dzięki temu erb nie będzie interpretował <%części tagu, która jest niezbędna w aplikacjach js, takich jak wyświetlanie podpowiedzi chart.js itp.

Aktualizacja (Naprawiono uszkodzony link)

Wszystko o ERB można teraz znaleźć tutaj: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags

bkunzi01
źródło
1
ten link dokładnie odpowiada OP
Ben Tinsley
Link jest teraz zerwany
andreofthecape 29.04.19
Zaktualizowany o nowy link!
bkunzi01,
3

Są one używane w rubinach na szynach :

<%%>: -

Znaczniki <%%> służą do wykonywania kodu Ruby, który niczego nie zwraca, np. Warunków, pętli lub bloków. Np .: -

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

<% =%>: -

służy do wyświetlania treści.

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

<% -%>: -

Railsy rozszerzają ERB, dzięki czemu można pomijać nowy wiersz po prostu dodając łącznik końcowy do znaczników w szablonach Railsów

<% #%>: -

skomentuj kod

<%# WRONG %>
Hi, Mr. <% puts "Frodo" %>
HeadAndTail
źródło
1

<% %>wykonuje tam kod, ale nie drukuje wyniku, na przykład:
Możemy go użyć, jeśli jeszcze w pliku erb.

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

Wydrukuje temp is 1


<%= %>wykonuje kod, a także wypisuje dane wyjściowe, na przykład:
Możemy wydrukować wartość zmiennej szyny.

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

Wydrukuje 1


<% -%>Nie robi to różnicy, ponieważ nic nie drukuje, -%>ma tylko sens <%= -%>, uniknie to nowej linii.


<%# %> skomentuje napisany w tym kodzie kod.

Aastha Kesarwani
źródło