Разница между -%> и%> в рельсах

Я начал несколько руководств по рельсам и заметил, что некоторые из блоков кода вида похожи на

<h1><%= @subject.name -%></h1>

и другие кодовые блоки похожи на

<h1><%= @subject.name %></h1>

В чем разница между -% > и% >

Если вы знаете какие-то хорошие ссылки на синтаксис, на которые вы можете указать мне, это также было бы полезно.

Ответ 1

Дополнительная тире заставляет ERB не выводить новую строку после закрывающего тега. В вашем примере нет разницы, но если у вас есть что-то вроде этого:

<div>
  <% if true -%>
  Hi
  <% end -%>
</div>

Он будет производить:

<div>
  Hi
</div>

а не это:

<div>

  Hi

</div>

Ответ 2

Я уверен, что - до %> больше не нужен, и его следует оставить без внимания.

Как минимум в Chrome, сгенерированный html выглядит так же, используя -%> или %>.

Ответ 3

Если вы используете HAML, а не ERB, вы можете сделать что-то подобное с символом меньше или больше, чем после вашего тега.

> удалит пробелы вокруг вашего тега, а < удалит в нем пробелы.

.float-left<
  %p
    Lorem ipsum dolor sit amet

скомпилирован для:

<div class="float-left"><p>
  Lorem ipsum dolor sit amet
</p></div>

А...

%left_tag
%inside>
%right_tag

скомпилирован для:

<left_tag /><inside /><right_tag />

Если вы не используете HAML, это определенно стоит проверить.

Ответ 4

UPDATE: этот ответ был неправильным, вместо этого fooobar.com/info/25623/....


В Ruby 2.1 (не обязательно с Rails), - удаляет одну конечную новую строку:

  • Новая строка должна быть первой char после >
  • пробелы не удаляются
  • удаляется только одна новая строка
  • вы должны передать параметр '-', чтобы использовать его

Примеры:

require 'erb'
ERB.new("<%= 'a' %>\nb").result              == "a\nb"  or raise
begin ERB.new("<%= 'a' -%>\nb").result; rescue SyntaxError ; else raise; end
ERB.new("<%= 'a'  %>\nb"  , nil, '-').result == "a\nb"  or raise
ERB.new("<%= 'a' -%>\nb"  , nil, '-').result == 'ab'    or raise
ERB.new("<%= 'a' -%> \nb" , nil, '-').result == "a \nb" or raise
ERB.new("<%= 'a' -%>\n b" , nil, '-').result == 'a b'   or raise
ERB.new("<%= 'a' -%>\n\nb", nil, '-').result == "a\nb"  or raise

Doc: http://ruby-doc.org/stdlib-2.1.1/libdoc/erb/rdoc/ERB.html

Rails 4.1 документирует это на http://api.rubyonrails.org/classes/ActionView/Base.html и появляется:

Однако Rails 4.1 удаляет завершающие пробелы как документированные, в то время как чистая ERB не делает, поэтому могут быть и другие отличия.

Кроме того, он не удаляет ведущие новые строки, как задокументировано: это может быть ошибка в документации. Открылась проблема: https://github.com/rails/rails/issues/16766