"# {}" нотация против нотации erb - PullRequest
4 голосов
/ 11 апреля 2011

В чем различия между обозначениями:

"
  some text
  #{some_ruby_code}
  some text
  #{some_more_ruby_code}
  some_other_text
"

и

ERB.new("
  some text
  <%=some_ruby_code%>
  some text
  <%=some_more_ruby_code%>
  some_other_text
").result

Просто у меня сложилось впечатление, что обозначение erb может быть более мощным, но не так ясно,Можете ли вы сравнить их по различным аспектам и сказать, какие из них следует использовать в каких случаях?Какие вещи можно сделать в одной записи, а не в другой?

Сложение 1

Большинство ответов до сих пор, кажется, утверждают, что erb неэффективени не должен использоваться, когда можно использовать "#{ }".Теперь давайте спросим другой путь.Почему нотация "#{ }" не может заменить erb?Разве это не было бы намного быстрее и лучше?

Добавление 2

В большинстве приведенных ниже ответов, по-видимому, предполагается, что одно вхождение "#{ }" не охватывает несколькострок, так что фрагмент кода, такой как цикл, занимающий несколько строк, не может быть встроен в него.Но почему нет?Если вы это сделаете, я не вижу никакой разницы с этим с <% >, за исключением того, что в последнем вы ставите <% > в каждой строке.

Ответы [ 3 ]

5 голосов
/ 11 апреля 2011

Вы правы, что ваша ERB версия должна давать тот же результат, что и обычная версия (я думаю), но ее назначение совершенно иное.

ERB действительно предназначен только для шаблонов: если вам нужно сгенерировать текст (например, HTML-страницу или документ), какой-нибудь шаблонизатор, такой как ERB, будет правильным инструментом. Однако он не предназначен для простой интерполяции строк: хотя он, безусловно, способен на это, это довольно периферийный способ решения этой задачи. Действительно, вы на самом деле создаете объект ERB из строки, а затем переводите его обратно в строку.

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

$ irb -rbenchmark -rerb
ruby-1.9.2-p136 :023 > Benchmark.bm do |bm|
ruby-1.9.2-p136 :024 >     bm.report 'interpolation' do
ruby-1.9.2-p136 :025 >       a = 'hello there'
ruby-1.9.2-p136 :026?>     5000.times { "well #{a}" }
ruby-1.9.2-p136 :027?>     end
ruby-1.9.2-p136 :028?>   bm.report 'erb' do
ruby-1.9.2-p136 :029 >       a = 'hello there'
ruby-1.9.2-p136 :030?>     5000.times { ERB.new("well <%= a %>").result(binding) }
ruby-1.9.2-p136 :031?>     end
ruby-1.9.2-p136 :032?>   end
      user     system      total        real
interpolation  0.000000   0.000000   0.000000 (  0.001495)
erb  0.340000   0.000000   0.340000 (  0.352098)
 => true 

Стандартный способ интерполировать код Ruby в строки - это использование #{} внутри строкового литерала. Это встроено на уровне language (в отличие от уровня library ).

4 голосов
/ 11 апреля 2011

Преимущества для ERB:

  1. Все уже знают и "любят" этот стиль в стиле PHP
  2. Вам не нужно беспокоиться о балансировке или спасении ' или "
  3. Как правило, вам не нужно программировать базовый механизм Ruby, т. Е. Вам не нужно определять метод, возможно расположенный в классе, возможно квалифицированный модулем и т. Д. *

В целом, я считаю, что общая идея состоит в том, чтобы отделить части программы, которые должны быть выполнены разработчиком программного обеспечения, от части, которую может сделать интерфейсный веб-разработчик. Например, разработчик программного обеспечения может просто указать, что @account_number доступен и на него могут ссылаться HTML-пользователи без квалификации Ruby.

В реальной жизни, кажется, много проектов с одним человеком, но, по крайней мере, когда-то нормой было бросить команду на типичную проблему. Даже сегодня, посмотрите на все вопросы Rails здесь о SO от разработчиков, которые, очевидно, почти не знают Ruby. И ERB предшествовал Rails, поэтому, если вы вернетесь к истокам механизма, было время, когда вы действительно нуждались в реальном отделе программного обеспечения, потому что каждый проект включал в себя создание инфраструктуры, так что вы, вероятно, не хотели требовать от Ruby программных квалификаций каждый последний член команды.

Теперь я понимаю, что вы имеете в виду. Если вы уже знаете Ruby, оправдать безобразие эрб гораздо сложнее.

1 голос
/ 11 апреля 2011

Недостатком использования ERB для общей интерполяции строк является то, что ERB действительно нацелен на генерацию HTML. Результатом будет множество проблем с кодировкой, когда вы забудете все уточнить и запутаетесь, почему ваши символы амперсандов, больше, меньше и т. Д. Искажены.

Я думаю, что для ERB будет больше вычислительных затрат, но это может не иметь значения.

Более того, если вы поместите встроенный ERB внутри Ruby, вы получите Ruby внутри ERB внутри Ruby (и, возможно, больше уровней при вызове методов из ERB), и это будет немного запутанным беспорядком. Подумайте о бедных душах, которым придется поддерживать ваш код, сказал, что бедная душа может быть даже вами.

ОБНОВЛЕНИЕ : Вы можете использовать #{} для простых шаблонов HTML (см. Усы для чего-то подобного), но было бы сложно и довольно уродливо создать повторяющийся раздел; повторяющиеся разделы довольно часто встречаются в шаблонах HTML, поэтому они должны быть простыми и естественными для системы шаблонов HTML. С помощью ERB вы можете просто:

<% a.each do |e| %>
    <!-- ... -->
<% end %>

но это будет беспорядок в #{} интерполяции. Вы также в конечном итоге будете делать #{html(blahblah)} все время, и большинство людей забудут.

Кроме того, «#» имеет особое значение в URL-адресах и другое специальное значение в CSS (где фигурные скобки также имеют особое значение); URL-фрагменты и фрагменты CSS довольно часто встречаются в шаблонах HTML, поэтому вы будете постоянно беспокоиться о путанице. Эта особенная неприятность, вероятно, будет проблемой только при использовании #{} для создания селектора CSS или фрагмента в URL, но этого достаточно, чтобы сделать его громоздким.

...