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

309

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

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

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

  • 1
    У вас есть несколько отличных ответов здесь. Также обратите внимание, что Haml часто является превосходной альтернативой ERb.
  • 1
    Да, с этим гораздо легче иметь дело, чем с ERb
Показать ещё 3 комментария
Теги:
templates
erb

7 ответов

409
Лучший ответ
<% %>

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

<%= %>

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

<% -%>

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

<%# %>

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

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

  • 14
    я встречал где-то в коде этот вариант еще <% ==%> кто-нибудь знает, что это?
  • 33
    Двойное равенство означает, что строка не экранирована, как в raw.
Показать ещё 6 комментариев
82

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

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

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

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

  • 0
    Я не вижу, что открытие <%- делает что-либо для лидирующих пробелов, и я не вижу нигде документированных. Вы уверены, что? Может быть, это другой вкус ERB. Там нет опций, показанных для этого в документации stdlib.
  • 1
    @AndrewVit - со страницы, на которую есть ссылка в этом ответе (страница ActionView :: Base docs): «<% - и -%> подавляют начальные и конечные пробелы, включая завершающий символ новой строки, и могут использоваться взаимозаменяемо с <% и%>. "
Показать ещё 1 комментарий
44

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

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

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

  • 1
    Во второй строке вы написали, что Rails использует eruby при соединении с erubis.
  • 1
    @DanielJonsson спасибо за отчет: это должно было быть erubis. Схожу с ума с таким количеством версий. Обновлено.
5

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

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

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

<% %> выполняет код там, но не печатает результат, например:
Мы можем использовать его для 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


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


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

1

Это использование в 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" %>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню