Я использую content_for и урожай для введения файлов JavaScript в нижнюю часть моего расположения, но задаюсь вопросом, что лучшая практика для включения встроенного JavaScript. Конкретно я задаюсь вопросом где помещенный описание типа сценария:
<% content_for :javascript do %>
<script type="text/javascript"> ... </script>
<% end %>
или
<% content_for :javascript do %> ... <% end %>
<script type="text/javascript">
<%= yield :javascript %>
</script>
<% end %>
Я использую первую опцию теперь и задаюсь вопросом, плохо ли это для включения нескольких
...объявления в рамках одного представления. Иногда у меня есть partials тот вывод к этому.
Я предпочитаю, чтобы yield макета выглядел так:
<html>
<!-- other stuff -->
<body>
<!-- other stuff -->
<%= yield :javascript %>
</body>
</html>
Тогда в представлении можно написать:
<% content_for :javascript do %>
<script type='text/javascript'>
function doMagic() {
//Mind-blowing awesome code here
}
</script>
<% end %>
<!-- More view Code -->
<%= render :partial => "sub_view_with_javascript" %>
И в частичном _sub_view_with_javascript.html.erb тоже можно написать:
<% content_for :javascript do %>
<script type='test/javascript'>
function DoMoreMaths() {
return 3+3;
}
</script>
<% end %>
Я обосновываю этот подход тем, что yield и content_for находятся в разных файлах. Вставлять тег script в каждый content_for не DRY но это позволяет подсветке синтаксиса распознать изменение языка в каждом файле и помогает мне в этом.
Если у вас несколько вызовов content_for в одном файле к одному и тому же символу (в нашем случае :javascript), я бы подумал о том, чтобы объединить их все в один верхний, но он идеально подходит для использования с партициями.
И HTML совершенно счастлив иметь столько блоков сценариев, сколько вы захотите. Единственная возможная загвоздка - при работе с кодом в инструментах разработчика, таких как firebug, требуется немного больше времени, чтобы найти нужный блок сценария для вашей функции. Это происходит только тогда, когда мне нужно установить точку останова javascript для отладки.