Яка різниця між <%, <% =, <% # і -%> в ERB в Rails?


368

Чи можете ви, будь ласка, описати використання наступних символів, які використовуються у файлі ERB:

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

яке використання кожного з них?


1
Тут ви отримали кілька чудових відповідей. Також зауважте, що Haml часто є чудовою альтернативою ERb.
Marnen Laibow-Koser

1
Так, з цим набагато простіше впоратися, ніж з ERb
simo


@Ciro Santilli: Незважаючи на вік, цей здається більш повним, ніж ваші посилання. Я голосую за те, щоб закрити їх як дупнів цього ..
Бред Верт

<%= %>і <%= -%>різні: лише останній видаляє пробіли білого кольору.
ілюзіоніст

Відповіді:


476
<% %>

Виконує рубіновий код у дужках.

<%= %>

Щось друкує у файл erb.

<% -%>

Уникає розриву рядків після виразу.

<%# %>

Код коментарів у дужках; не надсилається клієнту (на відміну від коментарів HTML).

Завітайте до Рубі Док, щоб дізнатися більше про ЄРБ.


17
я десь зустрічався в коді, цей варіант ще <% ==%> хтось знає, що це?
okliv

38
Подвійне рівне означає, що рядок не виходить, як у сирому.
Richard_G

7
Rails не використовує stdlib ERB: він використовує erubis: github.com/rails/rails/isissue/16766#issuecomment-54148778
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

3
Але ... але ... <%#це просто нормальний <%коментар Рубі #відразу після цього .... Так, цікаво думати, що це щось особливе, але хіба це не просто ідіома ERB, а не спеціальна синтаксична конструкція?
Відшкодування BalinKingOfMoria Reinstate

6
@QPaysTaxes вибачте з цього приводу, ви маєте рацію ... Наприклад, якщо у вас є багаторядкова ERB <%...%>, <%#...%>прокоментуйте все це, чого б вона не зробила, якби це був просто звичайний коментар (тобто він би коментував лише рядок це на).
Відшкодування BalinKingOfMoria Reinstate

86

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

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

<%# %> є коментарем ЄРБ

Ось хороший посібник: http://api.rubyonrails.org/classes/ActionView/Base.html


Я не бачу, що відкриття <%-нічого не робить для провідних пробілів, і я не бачу його ніде документально підтвердженим. Ви впевнені в цьому? Можливо, це інший аромат ЄРБ. У документах stdlib не вказано жодної опції.
Ендрю Віт

1
@AndrewVit - На сторінці, на яку йдеться у цій відповіді (ActionView :: Сторінка базових документів): "<% - і -%> придушують провідні та кінцеві пробіли, включаючи трейлінг нового рядка, і можуть використовуватися взаємозамінно з <% і%>. "
Граф Дженкінс

5
Як придушити провідний пробіл на <% =%>?
Богдан Гусієв

51

Rails не використовує ERB stdlib за замовчуванням, він використовує ерубіс . Джерела: коментар цього розробника , gemspec ActionView , прийняв запит на злиття, який я зробив під час написання цього запису .

Там є поведінкові відмінності між ними, зокрема , про те , як оператори дефіс %-і -%роботи.

Документації мало, де "офіційно" визначений формат ERB в Рубі? тож наступним є емпіричні висновки.

Всі тести припускають:

require 'erb'
require 'erubis'

Коли можна використовувати -

  • ЄРБ: ви повинні перейти -до 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

Що -%робить:

  • ЄРБ: видаліть наступний символ, якщо це новий рядок.

  • ерубіс:

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

    • в <%= -%>=):

      • видаліть весь рядок, якщо він містить лише пробіли
      • в іншому випадку, якщо перед тегом є пробіл, а після - лише пробіли, видаліть білі місця, що з’являються після
      • інакше, після тегу є пробіл: не робіть нічого

Приклади:

# 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

Що %-робить:

  • ЄРБ: видаліть пробіли перед тегом та після попередніх нових рядків, але тільки якщо раніше були лише пробіли.

  • ерубіс: марний, оскільки <%- %>це те саме, що <% %>(без =), і це не можна використовувати =, коли єдиний випадок -%може бути корисним. Тому ніколи цього не використовуйте.

Приклади:

# 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 використовує ерубі під час посилання на ерубіс.
Даніель Джонсон

1
@DanielJonsson дякує за доповідь: це мало бути ерубісом. Зробили гайки з такою кількістю версій. Оновлено.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

10
  • <% %> : Виконує рубіновий код
  • <%= %>: Друкує у файл Erb. Або браузер
  • <% -%> : Уникає розриву рядків після виразу.
  • <%# %> : Коментар ЄРБ

7

Я <%%відповів на це буквальним розмежувачем тегів як його невиразність. Це дозволить erb не інтерпретувати ту <%частину тегу, яка необхідна для js-програм, наприклад, відображення підказки tool.js

Оновити

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


1
це посилання відповідає на ОП точно
Бен Тінслі

Зараз посилання розірвано
andreofthecape

Оновлено новим посиланням!
bkunzi01

3

Це використання в рубіні на рейках : -

<%%>: -

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

1

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

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

Буде надруковано temp is 1


<%= %>виконує код, а також друкує вихід, наприклад:
Ми можемо надрукувати значення змінної рейки.

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

Буде надруковано 1


<% -%>Це не має ніякої різниці, оскільки він нічого не друкує, -%>лише має сенс <%= -%>, це дозволить уникнути нового рядка.


<%# %> прокоментує код, написаний у цьому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.