Подтвердить что ты не робот

Как включить файл coffeescript только на одной странице?

Изменить: через год, если я собираюсь сделать это снова, я бы сделал это с curl.js вместо конвейера Rails.

Связанный: Лучший способ добавить специфичный для страницы javascript в приложении Rails 3?

Я пишу приложение и использую coffeescript для генерации всех js. Вот почему связанный с этим вопрос не делает то, что мне нужно.

Я бы хотел, чтобы файл coffeescript был помещен в подпапку моего каталога ресурсов, и этот файл. coffee можно получить только на одной странице. Страница находится по именованному маршруту

match 'myNotifications' => 'user#notifications'

Самое очевидное, что нужно положить файл .coffee в assets\javascripts\user\index.js.coffee. Но после прочтения документов об активах я неясен.

Я прочитал эту строку (из http://guides.rubyonrails.org/asset_pipeline.html):

Вы должны поместить любой JavaScript или CSS, уникальный для контроллера внутри их соответствующие файлы активов, так как эти файлы могут быть загружены только для этих контроллеров с линиями, такими как <% = javascript_include_tag params [: controller]% > или <% = stylesheet_link_tag params [: controller] % > .

Хорошо круто, поэтому я поставил js страницы в assets\javascripts\user.js.coffee. Затем я перезагрузил свою домашнюю страницу, Ctrl F5. Файл user.js по-прежнему загружается на главной странице. Протестировано с помощью $ -> alert 'ready from users controller'; видя это предупреждение при загрузке главной страницы.

Есть ли у Rails способ иметь файл страницы на странице, который будет обслуживаться только с этой страницей? Я читаю руководство неправильно? Есть ли место в папке с ресурсами, в которое я могу поместить файлы. Coffee, где они не будут загружаться с каждой страницы?

Обновить. Похоже, я мог получить ответ:

Есть несколько способов, которыми мы можем обойти эту проблему. Мы может использовать require_directory вместо require_tree, поскольку это будет загружать файлы в текущий каталог, а не в подкаталоги. Если мы хотим большего контроля над включенными файлами, которые мы можем требовать от них отдельно, а не включать весь каталог. В качестве альтернативы мы может перемещать файлы JavaScript, которые мы хотим включить во все страниц в общий подкаталог. Затем мы можем использовать require_tree. /public включить только эти файлы.

Я дам этот выстрел в АМ.

4b9b3361

Ответ 1

Вместо того, чтобы включать только файл на одной странице, вы можете просто использовать логику, которая условна на разметке страницы. См. мой ответ на соответствующий вопрос. Таким образом, вашим пользователям не нужно делать дополнительный <script> запрос для конкретной страницы.

Если существует много логики, характерной для этой страницы (например, 10K + minified), тогда да, разделите ее. Как вы предложили в редактировании на свой вопрос: вместо того, чтобы делать require_tree . в корневом каталоге javascripts, вместо этого создайте подкаталог с именем global и измените верх application.js на

require_tree .

к

require_tree global

Затем поместите свой файл CoffeeScript, специфичный для вашей страницы, в корневой каталог javascripts и укажите его с вызовом javascript_include_tag в этом шаблоне страницы.

Ответ 2

Здесь подход, который я использую для создания контроллера/просмотра конкретного кофе:

application.html.haml:

%body{ :data => { :controller => params[:controller], :action => params[:action]} }

альт. application.html.erb

<%= content_tag(:body, :data => { :controller => params[:controller], :action => params[:action] }) do %>
  ...
<% end %>

application.js.coffee:

$(document).ready ->
  load_javascript($("body").data('controller'),$("body").data('action'))

load_javascript = (controller,action) ->
  $.event.trigger "#{controller}.load"
  $.event.trigger "#{action}_#{controller}.load"

users.js.coffee

$(document).bind 'edit_users.load', (e,obj) =>
  # fire on edit users controller action

$(document).bind 'show_users.load', (e,obj) =>
  # fire on show users controller action

$(document).bind 'users.load', (e,obj) =>
  # fire on all users controller actions

Sidenote:

Это отлично работает с PJAX, а также вы можете передавать имена контроллеров/действий с заголовком ответа на запросы PJAX и просто запускать эти js-функции на основе этого.

EDIT (2014/03/04): Это решение все еще работает при использовании turbolinks.js.