Javascript, представления Rails, content_for и DRYness

В Rails общая идиома для специфичного для страницы Javascript:

(макет)

<head>
  <% yield :javascript %>
</head>

(Посмотреть)

<% content_for :javascript do %>
  <script type="text/javascript">
    $().whatever;
  </script>
<% end %>

Я ненавижу повторять теги сценария. Есть ли какая-то причина, почему следующее - плохая идея?

(макет)

<head>
  <script type="text/javascript">
    <% yield :javascript %>
  </script>
</head>

(Посмотреть)

<% content_for :javascript do %>
    $().whatever;
<% end %>

person Jay Levitt    schedule 10.05.2011    source источник
comment
Вы можете поместить тег <script> в любое место <body>, и он будет выполнен. Есть ли особая причина, по которой вы хотите поместить его в <head>?   -  person Austin Taylor    schedule 10.05.2011


Ответы (3)


Я согласен, что это то, что наиболее характерно для вашего варианта использования. Как правило, когда я использую ‹% yield :javascript %>, цель состоит в том, чтобы добавить библиотеки для конкретных страниц, что было бы ограничением для предложенного вами подхода. Если вы хотите поддержать оба, я сделал следующее:

(макет)

<head>
  <% yield :javascript_libraries %>
  <script type="text/javascript">
    <% yield :javascript %>
  </script>
</head>

(Посмотреть)

<% content_for :javascript do %>
    $().whatever;
<% end %>
<% content_for :javascript_library do %>
    <%= javascript_include_tag 'page-specific.js' %>
<% end %>

Конечно, большинство людей помещают библиотеки javascript внизу для оптимизации загрузки страницы, поэтому вы можете просто переместить их в свой макет.

person bencode    schedule 10.05.2011

Идиомы — это здорово и все такое, но самое главное — это продуктивность вас и вашей команды и способность поддерживать вещи, если вы согласны с этим, я тоже не вижу в этом никаких проблем. Тем не менее, я делал это раньше, а также видел, как это делается в проектах, хотя теперь я обычно помещаю это в файл сценария, если мне абсолютно не нужно иметь его на конкретной странице.

person Jimmy    schedule 10.05.2011
comment
Я согласен. Я бы поместил его в файл what.js и: <% content_for :javascript do -%><%= javascript_include_tag 'whatever' %><% end -%> - person Mischa; 10.05.2011
comment
Но AIUI, вы не можете отображать представление .js из .html, верно? Вам все еще нужно называть его .html.erb? Меня это почему-то очень бесит. - person Jay Levitt; 10.05.2011

Если вы хотите упростить свои представления, я настоятельно рекомендую HAML (и его родственный SASS для CSS). Существует небольшая кривая обучения, и вы, возможно, не захотите конвертировать все существующие представления сразу, но я сомневаюсь, что вы когда-нибудь захотите вернуться к уродливому беспорядку ERB.

В HAML это будет выглядеть так:

= content_for :head do
  :javascript
    $().whatever;
person Jeremy Weathers    schedule 10.05.2011