В Rails 3 есть немного ненавязчивый JavaScript, который довольно крутой.
Но мне было интересно, как лучше всего включить дополнительный JavaScript для конкретной страницы.
Например, где я, возможно, ранее сделал:
<%= f.radio_button :rating, 'positive', :onclick => "$('some_div').show();" %>
Теперь мы можем сделать это ненавязчивым с чем-то вроде
<%= f.radio_button :rating, 'positive' %>
# then in some other file
$('user_rating_positive').click(function() {
$('some_div').show();
}
Итак, я думаю, мой вопрос, где / как включить этот JavaScript? Я не хочу заполнять application.js
файл, потому что этот JavaScript применим только к этому одному представлению. Должен ли я как-то включить собственный файл JavaScript для каждой страницы или вставить его в переменную экземпляра, которую ищет заголовок?
javascript
ruby-on-rails
ruby-on-rails-3
Брайан Армстронг
источник
источник
Ответы:
Что мне нравится делать, так это включать Javascript для каждого вида в
content_for :head
блок, а затемyield
в этот блок в макете приложения. НапримерЕсли он довольно короткий, то:
или, если дольше, то:
Затем в вашем файле макета
источник
<%= javascript_include_tag "my_javascipt_file" %>
?Если вы хотите включить javascript только на одной странице, вы, конечно же, можете включить его на страницу, но если вы хотите сгруппировать свой javascript и воспользоваться преимуществами конвейера ресурсов, минимизированного js и т. Д., Это можно сделать и получить дополнительные Активы js, которые объединяются и загружаются только на определенных страницах, разбивая ваши js на группы, которые применяются только в определенных контроллерах / представлениях / разделах сайта.
Переместите ваши js-ресурсы в папки, с отдельным файлом манифеста для каждого, поэтому, если у вас есть библиотека js-администратора, которая используется только в серверной части, вы можете сделать это:
в существующем application.js
в новом файле манифеста admin.js
Убедитесь, что этот новый js-манифест загружен, отредактировав config / production.rb
Затем настройте макет страницы, чтобы в заголовок страницы можно было добавить несколько js:
Затем в представлениях, где вы хотите включить эту конкретную группу js (а также обычную группу приложений) и / или любые специфичные для страницы js, css и т. Д .:
Конечно, вы можете сделать то же самое с css и сгруппировать его аналогичным образом, чтобы применить его только к определенным областям сайта.
источник
//= require_tree ./global
, но не если я//= require_directory ./global
использую Rails 3.2.12.Эти ответы мне очень помогли! Если кто-то хочет немного больше ...
application.js.coffee
этого файла, все javacsripts будут загружаться каждый раз, когда вы переходите на другую страницу, и цель создания специфичных для страницы javascript-скриптов будет отменена.Следовательно, вам нужно создать свой собственный файл манифеста (например
speciifc.js
), который потребует все специфичные для страницы файлы javascript. Кроме того, изменитьrequire_tree
изapplication.js
приложение / активы / JavaScripts / application.js
приложение / активы / JavaScripts / specific.js
Затем
environments/production.rb
добавьте этот манифест в предварительно скомпилированный список с параметром config,config.assets.precompile += %w( specific.js )
Готово! Все общие javascripts, которые всегда должны быть загружены, будут помещены в
app/assets/javascripts/global
папку, а специфичные для страницы javascripts - вapp/assets/javascripts/specific
. Вы можете просто вызвать специфичные для страницы javascripts из вида как<%= javascript_include_tag "specific/whatever.js" %>
//.js не является обязательным.Этого достаточно, но я тоже хотел этим воспользоваться
javascript_include_tag params[:controller]
. Когда вы создаете контроллеры, ассоциированный файл coffeescript генерируется так же,app/assets/javascripts
как и другие упомянутые люди. Существуют действительно специфичные для контроллера javascripts, которые загружаются только тогда, когда пользователь достигает определенного вида контроллера.Итак, я создал еще один манифест
controller-specific.js
приложение / активы / JavaScripts / контроллер-specific.js
//= require_directory .
Это будет включать в себя все автоматически сгенерированные сценарии, связанные с контроллерами. Также вам необходимо добавить его в предварительно скомпилированный список.
config.assets.precompile += %w( specific.js controller-specific.js )
источник
javascript_include_tag params[:controller]
. В настоящее время в моей application.html.erb есть эта строкаjavascript_include_tag 'application'
. Должен ли я заменить это другой строкой?<%= javascript_include_tag "specific/whatever.js" %>
вcontent_for :header
блоке?config.assets.precompile
. Разве все неapp/assets/javascripts/*.js
прекомпилируется автоматически?application.css
иapplication.js
. Другие должны быть либо включены в другие файлы, либо перечислены с помощьюconfig.assets.precompile
. Читайте больше здесьconfig.assets.precompile
иconfig.assets.version
переместился в конфигурацию / Инициализаторы / assets.rbЯ предпочитаю следующее ...
В вашем файле application_helper.rb
а затем в вашем конкретном представлении (app / views / books / index.html.erb в этом примере)
... кажется, работает на меня.
источник
Если вы не хотите использовать конвейер ресурсов или сложные обходные пути, чтобы получить необходимый javascript для конкретной страницы (я сочувствую), самый простой и надежный способ, который достигается так же, как и ответы выше, но с меньшим количеством кода, это просто использовать:
Примечание: для этого требуется еще один запрос http на каждый тег включения, чем ответы, которые используют
content_for :head
источник
javascript_include_tag
было именно то, что я искал, ура AJP//= require .
в application.js?//= require .
этот сценарий будет перенесен на любую страницу вашего сайта, поэтому вам нужно будет сделать что-то вроде предложенного Кенни Гранта (использовать//= require_tree ./global
) или bjg.//= require_tree .
чтобы//= require_directory .
в application.js , а затем создал подкаталог в активах \ JavaScripts. Обратите внимание, что вы должны включить новый каталог в config \ initializer \ assets.rb, чтобы предварительно скомпилировать ваш js, добавив строку:Rails.application.config.assets.precompile += %w( new_dir/js_file.js )
Посмотрите на гем pluggable_js . Вы можете найти это решение проще в использовании.
источник
Насколько я понимаю, конвейер ресурсов предназначен для уменьшения времени загрузки страницы путем объединения всех ваших js в один (минимизированный) файл. Хотя на первый взгляд это может показаться отвратительным, на самом деле эта функция уже существует в популярных языках, таких как C и Ruby. Такие вещи, как теги include, предназначены для предотвращения многократного включения файла и для помощи программистам в организации их кода. Когда вы пишете и компилируете программу на C, весь этот код присутствует в каждой части вашей работающей программы, но методы загружаются в память только тогда, когда этот код используется. В некотором смысле, скомпилированная программа не содержит ничего, чтобы гарантировать, что код является красиво модульным. Мы делаем код модульным, записывая наши программы таким образом, и операционная система загружает в память только те объекты и методы, которые нам нужны для данной местности. Есть ли вообще такая вещь, как «метод-специфическое включение»? Если ваше приложение rails спокойное, это, по сути, то, о чем вы просите.
Если вы пишете свой javascript так, чтобы он улучшал поведение элементов HTML на странице, то эти функции являются «специфичными для страницы» по своему дизайну. Если есть какой-то сложный код, который вы написали таким образом, что он будет выполняться независимо от его контекста, возможно, стоит рассмотреть возможность привязки этого кода к элементу html (вы можете использовать тег body, как описано в методе Garber-Irish ). Если функция выполняется условно, производительность, вероятно, будет меньше, чем у всех этих дополнительных тегов сценария.
Я думаю об использовании драгоценного камня paloma , как описано в проекте rails apps . Затем вы можете сделать свой javascript специфичным для страницы, включив специфичные для страницы функции в обратный вызов paloma:
Вы используете рельсы, поэтому я знаю, что вы любите драгоценные камни :)
источник
Вам не следует загружать файлы JS или CSS за пределы конвейера ресурсов, потому что вы теряете важные функции, которые делают Rails таким замечательным. И тебе не нужен еще один драгоценный камень. Я верю в использование как можно меньшего количества драгоценных камней, и использование драгоценного камня здесь не обязательно.
То, что вы хотите, известно как «Javascript для конкретного контроллера» («Javascript для конкретного действия включен внизу). Это позволяет вам загружать определенный файл JavaScript для определенного КОНТРОЛЛЕРА. Попытка подключить ваш Javascript к представлению является своего рода ... назад и не следует шаблону проектирования MVC. Вы хотите связать его с вашими контроллерами или действиями внутри ваших контроллеров.
К сожалению, по какой-то причине разработчики Rails решили, что по умолчанию каждая страница будет загружать каждый файл JS, расположенный в вашем каталоге ресурсов. Почему они решили сделать это вместо включения «Javascript для контроллера» по умолчанию, я никогда не узнаю. Это делается с помощью файла application.js, который по умолчанию содержит следующую строку кода:
Это известно как директива . Это то, что sprockets использует для загрузки каждого файла JS в каталоге assets / javascripts. По умолчанию sprockets автоматически загружает application.js и application.css, а директива require_tree загружает каждый файл JS и Coffee в соответствующие каталоги.
ПРИМЕЧАНИЕ. Когда вы создаете леса (если вы не используете леса, сейчас самое время начать), Rails автоматически генерирует файл кофе для вас, для контроллера этого леса. Если вы хотите, чтобы он генерировал стандартный файл JS вместо файла кофе , то удалите самоцвет кофе , включенный по умолчанию в вашем Gemfile , и ваш скаффолд будет создавать файлы JS.
Итак, первый шаг к включению «Javascript для конкретного контроллера» - это удалить код require_tree из вашего файла application.js, ИЛИ изменить его на папку в вашем каталоге assets / javascripts, если вам все еще нужны глобальные файлы JS. IE:
Шаг 2: Перейдите в файл config / initializers / assets.rb и добавьте следующее:
Вставьте нужные имена контроллеров.
Шаг 3: Замените javascript_include_tag в вашем файле application.html.erb следующим образом (обратите внимание на часть params [: controller]:
Перезагрузите свой сервер и альт! Файл JS, сгенерированный вашим скаффолдом, теперь будет загружаться только при вызове этого контроллера.
Нужно загрузить конкретный файл JS на конкретный ДЕЙСТВИЕ в вашем контроллере , IE / article / new ? Сделайте это вместо этого:
application.html.erb :
config / initializers / assets.rb :
Затем добавьте новую папку с тем же именем, что и у вашего контроллера, в папку assets / javascripts и поместите в нее файл js с тем же именем, что и у вашего действия. Затем он загрузит его на это конкретное действие.
источник
Хорошо, возможно, это похоже на худшую работу, но я создал метод контроллера, который только что вывел файл .js
контроллер
Посмотреть
если по какой-то причине мы не хотим этого делать, дайте мне знать.
источник
Предпочтительным способом добавления JS является нижний колонтитул, поэтому вы можете сделать это следующим образом:
show.html.erb:
макеты / application.html.erb
источник