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

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

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

какое использование каждого из них?

Ответ 1

<% %>

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

<%= %>

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

<% -%>

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

<%# %>

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

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

Ответ 2

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

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

<%# %> является комментарием ERB

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

Ответ 3

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

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

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

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

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:

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

    • in <%= -%>=):

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

Примеры:

# 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

Что %- и -% делают вместе

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

Ответ 4

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

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

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

Ответ 5

  • <% %> %% <% %>: Выполняет рубиновый код
  • <%= %>: Печатает в файл Erb. Или браузер
  • <% -%>: предотвращает разрыв строки после выражения.
  • <%# %>: Комментарий ERB

Ответ 6

Это использование в ruby ​​on rails: -

<%% > : -

Теги <%% > используются для выполнения кода 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" %>

Ответ 7

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

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

Будет ли temp is 1 печати temp is 1


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

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

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


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


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