Вам не следует загружать файлы JS или CSS за пределы конвейера ресурсов, потому что вы теряете важные функции, которые делают Rails таким замечательным. И тебе не нужен еще один драгоценный камень. Я верю в использование как можно меньшего количества драгоценных камней, и использование драгоценного камня здесь не обязательно.
То, что вы хотите, известно как «Javascript для конкретного контроллера» («Javascript для конкретного действия включен внизу). Это позволяет вам загружать определенный файл JavaScript для определенного КОНТРОЛЛЕРА. Попытка подключить ваш Javascript к представлению является своего рода ... назад и не следует шаблону проектирования MVC. Вы хотите связать его с вашими контроллерами или действиями внутри ваших контроллеров.
К сожалению, по какой-то причине разработчики Rails решили, что по умолчанию каждая страница будет загружать каждый файл JS, расположенный в вашем каталоге ресурсов. Почему они решили сделать это вместо включения «Javascript для контроллера» по умолчанию, я никогда не узнаю. Это делается с помощью файла application.js, который по умолчанию содержит следующую строку кода:
//= require_tree .
Это известно как директива . Это то, что 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:
//= require_tree ./global
Шаг 2: Перейдите в файл config / initializers / assets.rb и добавьте следующее:
%w( controllerone controllertwo controllerthree ).each do |controller|
Rails.application.config.assets.precompile += ["#{controller}.js", "#{controller}.css"]
end
Вставьте нужные имена контроллеров.
Шаг 3: Замените javascript_include_tag в вашем файле application.html.erb следующим образом (обратите внимание на часть params [: controller]:
<%= javascript_include_tag 'application', params[:controller], 'data-turbolinks-track': 'reload' %>
Перезагрузите свой сервер и альт! Файл JS, сгенерированный вашим скаффолдом, теперь будет загружаться только при вызове этого контроллера.
Нужно загрузить конкретный файл JS на конкретный ДЕЙСТВИЕ в вашем контроллере , IE / article / new ? Сделайте это вместо этого:
application.html.erb :
<%= javascript_include_tag "#{controller_name}/#{action_name}" if AppName::Application.assets.find_asset("#{controller_name}/#{action_name}") %>
config / initializers / assets.rb :
config.assets.precompile += %w(*/*)
Затем добавьте новую папку с тем же именем, что и у вашего контроллера, в папку assets / javascripts и поместите в нее файл js с тем же именем, что и у вашего действия. Затем он загрузит его на это конкретное действие.