В чем разница между <%, <% =, <% # и -%> в ERB в Rails? - PullRequest
336 голосов
/ 03 ноября 2011

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

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

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

Ответы [ 7 ]

438 голосов
/ 03 ноября 2011
<% %>

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

<%= %>

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

<% -%>

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

<%# %>

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

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

85 голосов
/ 03 ноября 2011

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

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

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

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

47 голосов

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

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

Документация недостаточна, Где "официально" определен формат 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 <%= -%>=):

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

Примеры:

# 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

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

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

7 голосов
/ 09 июня 2016

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

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

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

4 голосов
/ 23 августа 2018
  • <% %>: выполняет код рубина
  • <%= %>: печать в файл Erb.Или браузер
  • <% -%>: предотвращает разрыв строки после выражения.
  • <%# %>: комментарий ERB
1 голос
/ 15 мая 2018

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


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


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

1 голос
/ 12 ноября 2017

Используются в 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" %>
...