В чем разница между <%, <% =, <% # и -%> в ERB в Rails?

368

Может кто-нибудь, пожалуйста, опишите использование следующих символов, которые используются в файле ERB:

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

какая польза от каждого?

Симо
источник
1
У вас есть несколько отличных ответов здесь. Также обратите внимание, что Haml часто является превосходной альтернативой ERb.
Марнен Лайбоу-Козер
1
Да, с этим гораздо легче иметь дело, чем с ERb
simo
1
возможный дубликат разницы между -%> и%> в рельсах для -%>и stackoverflow.com/questions/3952403/… для <%=, stackoverflow.com/questions/3901619/… для <%#.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
@ Сиро Сантилли: Несмотря на возраст, этот кажется более полным, чем ваши ссылки. Я голосую за то, чтобы закрыть их как обманщиков этого ...
Брэд Верт
<%= %>и <%= -%>отличаются: только последний удаляет конечные пробелы.
Иллюзионист

Ответы:

476
<% %>

Выполняет код рубина в скобках.

<%= %>

Печатает что-то в файл erb.

<% -%>

Предотвращает разрыв строки после выражения.

<%# %>

Комментирует код в скобках; не отправляется клиенту (в отличие от комментариев HTML).

Посетите Ruby Doc для получения дополнительной информации о ERB.

auralbee
источник
17
я встречал где-то в коде этот вариант еще <% ==%> кто-нибудь знает, что это?
okliv
38
Двойное равенство означает, что строка не экранирована, как в raw.
Richard_G
7
Rails не использует stdlib ERB: он использует erubis: github.com/rails/rails/issues/16766#issuecomment-54148778
Сиро Сантилли 法轮功 冠状 病 六四 事件 法轮功
3
Но ... но ... <%#это просто нормально <%с комментарием Ruby #сразу после него ... Да, забавно думать, что это что-то особенное, но разве это не просто идиома ERB, а не специальная синтаксическая конструкция?
BalinKingOfMoria восстанавливает СМ
6
@QPaysTaxes жаль , что вы правы ... Например, если у вас есть многострочный Еврорадио <%...%>, <%#...%>комментарии из всех его, что он не будет делать , если это был просто нормальный комментарий (т.е. было бы только закомментировать строку это включено).
BalinKingOfMoria восстанавливает CM
86

<% %>и <%- and -%>для любого кода Ruby, но не выводит результаты (например, операторы if). два одинаковы.

<%= %> для вывода результатов кода Ruby

<%# %> это комментарий ERB

Вот хорошее руководство: http://api.rubyonrails.org/classes/ActionView/Base.html

yalestar
источник
Я не вижу, что открытие <%-что-то делает для пробелов, и я не вижу, чтобы это было документировано. Вы уверены, что? Может быть, это другой вкус ERB. Там нет опций, показанных для этого в документации stdlib.
Эндрю Вит
1
@AndrewVit - со страницы, на которую есть ссылка в этом ответе (страница ActionView :: Base docs): «<% - и -%> подавляют начальные и конечные пробелы, включая завершающий символ новой строки, и могут использоваться взаимозаменяемо с <% и%>. "
Эрл Дженкинс
6
Как подавить начальные пробелы для <% =%>?
Богдан Гусиев
52

Rails делает не использовать в Еврорадио STDLIB по по умолчанию, он использует erubis . Источники: комментарий этого разработчика , gemspec ActionView , принял запрос на слияние, который я сделал, когда писал это .

Там являются поведенческие различия между ними, в частности , о том , как операторы дефис %-и -%работы.

Документация недостаточна. Где официально определен формат ERB в Ruby? так что ниже приведены эмпирические выводы.

Все тесты предполагают:

require 'erb'
require 'erubis'

Когда вы можете использовать -

  • ERB: вы должны перейти -к trim_modeварианту ERB.newего использования.
  • erubis: включен по умолчанию.

Примеры:

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

Что -%делает:

  • ERB: удалить следующий символ, если это новая строка.

  • erubis:

    • в <% %>(без =), -бесполезен, потому что <% %>и <% -%>одинаковы. <% %>удаляет текущую строку, если она содержит только пробелы, и ничего не делает иначе.

    • в <%= -%>=):

      • удалить всю строку, если она содержит только пробелы
      • иначе, если перед тегом есть пробел, и только после пробелов, удалите пробелы после
      • иначе после тега есть пробел: ничего не делать

Примеры:

# 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

Что %-делает:

  • ERB: удалить пробелы перед тегом и после предыдущих новых строк, но только если до этого есть только пробелы.

  • erubis: бесполезно, потому что <%- %>это то же самое, что и <% %>(без =), и это нельзя использовать, =что является единственным случаем, когда -%может быть полезным. Так что никогда не используйте это.

Примеры:

# 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

Чем %-и -%занимаемся вместе

Точная комбинация обоих эффектов в отдельности.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
источник
1
Во второй строке вы написали, что Rails использует eruby при соединении с erubis.
Даниэль Йонссон
1
@DanielJonsson спасибо за отчет: это должно было быть erubis. Схожу с ума с таким количеством версий. Обновлено.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
10
  • <% %> : Выполняет код рубина
  • <%= %>: Печать в файл Erb. Или браузер
  • <% -%> : Предотвращает разрыв строки после выражения.
  • <%# %> : Комментарий ERB
Неха Накрани
источник
7

Я добавил <%%буквальный тег-разделитель в качестве ответа на этот вопрос из-за его неясности. Это скажет erb не интерпретировать ту <%часть тега, которая необходима для js-приложений, например отображение подсказок chart.js и т. Д.

Обновление (исправлена ​​неработающая ссылка)

Все о ERB теперь можно найти здесь: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags

bkunzi01
источник
1
эта ссылка отвечает на ОП точно
Бен Тинсли
Ссылка теперь не работает
andreofthecape
Обновлено с новой ссылкой!
bkunzi01
3

Это использование в ruby ​​на рельсах :

<%%>: -

Теги <%%> используются для выполнения кода Ruby, который ничего не возвращает, например, условия, циклы или блоки. Например: -

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

<% =%>: -

использовать для отображения содержимого.

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

<% -%>: -

Rails расширяет ERB, так что вы можете подавить новую строку, просто добавив конечный дефис к тегам в шаблонах Rails

<% #%>: -

закомментируйте код

<%# WRONG %>
Hi, Mr. <% puts "Frodo" %>
HeadAndTail
источник
1

<% %>выполняет код там, но не печатает результат, например:
Мы можем использовать его для if if в файле erb.

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

Будет печатать temp is 1


<%= %>выполняет код, а также печатает вывод, например:
Мы можем напечатать значение переменной rails.

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

Будет печатать 1


<% -%>Это не имеет значения, так как ничего не печатает, -%>имеет смысл только <%= -%>, это позволит избежать новой строки.


<%# %> закомментирует код, написанный в этом.

Ааста Кесарвани
источник