Javascript Include Tag Best Practice в приложении Rails

Скажем, мне нужно вызвать файл javascript в <head> шаблона ERb. Я инстинктивно делаю как обычно:

<head>
<%= javascript_include_tag :defaults %> <!-- For example -->
</head>

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

Итак, мне интересно, есть ли хороший способ загрузки javascript в заголовки, например, всех шаблонов ERb, найденных только в определенном каталоге.


person btw    schedule 23.12.2008    source источник


Ответы (4)


Я бы использовал content_for.

Например, укажите место для вставки в макете приложения:

<head>
<title>Merry Christmas!</title>
<%= yield(:head) -%>
</head>

И отправить его туда из представления:

<%- content_for(:head) do -%>
<%= javascript_include_tag :defaults -%>
<%- end -%>
person maurycy    schedule 23.12.2008
comment
Почему ‹%- вместо ‹%= ? Это какой-то особый синтаксис? - person Martin Konicek; 24.07.2011
comment
В более старых версиях рельсов ‹%- предотвращает создание erb ненужных пробелов перед тегом ‹%. Это происходит автоматически с более новыми версиями - person Gu1234; 17.08.2011
comment
Этот ответ помог, но я предпочитаю более короткую реализацию с одной строкой: <% content_for(:head) { javascript_include_tag :this_file, :that_file, :more_files } %> - person Matthew Clark; 03.02.2012
comment
@MaffooClock: А если вы хотите еще короче, вы можете удалить фигурные скобки и просто сделать ‹% content_for :head, javascript_include_tag(:this_file, :that_file, :more_files) %›. Видеть? Сэкономил два символа! ;-) - person Ivan Navarrete; 12.02.2012

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

person JasonOng    schedule 24.12.2008
comment
что если у вас есть включения, применимые только к административной части веб-сайта? - person Ali; 06.12.2009

Я бы посоветовал не добавлять javascript в заголовок, так как он замедляет загрузку страницы. Скорее загрузите js внизу страницы, что быстрее. http://developer.yahoo.com/performance/rules.html#js_bottom

<body>
 ....
  <%= yield(:js) -%>
</body>

И отправить его туда из представления:

<%- content_for(:js) do -%>
  <%= javascript_include_tag :defaults -%>
<%- end -%>
person Jitu    schedule 19.06.2013

У меня обычно есть следующее в файле макета:

<head>
  <%= javascript_include_tag :defaults %> <!-- For example -->
  <%= @extra_head_content %>
</head>

А потом в представлениях:

<% (@extra_head_content ||= "") += capture do %>
  <%= other_content %>
<% end %>

См. документацию по API для #capture.

person Gareth    schedule 23.12.2008