2016-01-24 2 views
0

Я создаю небольшое приложение для рельсов, и я хочу использовать jquery вместо coffeescript, поэтому я переименовал все сгенерированные файлы javascript в .js.Почему рельсы загружают все файлы javascript во всех контроллерах?

Теперь javascript, добавляемый в этот файл js, кажется, доступен для ВСЕХ моих контроллеров. Например, добавив что-то в document.ready в моем employees.js, это будет срабатывать во всех моих представлениях, а не только для Employee-контроллера?

Почему это так и есть, так или иначе, чтобы настроить это?

+0

@ где вы держите свой employee.js? –

+0

@PraveenGeorge В активах/javascripts – marsrover

+1

@marover: любой код javascript, который вы помещаете внутри вашего employee.js, будет выполняться под всеми представлениями, связанными с контроллером сотрудников. –

ответ

0

Вы можете включить различные наборы активов, создав различные макеты в app/views/layouts.

Изменяя линию <%= javascript_include_tag "main" %> в макете, вы можете включить различные файлы javascript. Все файлы js обычно группируются в один файл с именем application.js по Rails Asset Pipeline, но вы также можете включать их отдельно и использовать разные макеты для каждого контроллера или даже действия.

Вы можете добавить layout :name_of_layout к контроллеру, чтобы установить макет по умолчанию для всех действий контроллера. Если вы хотите, чтобы каждое действие имело другой макет, вы можете передать его как вариант своей функции рендеринга: render layout: :name_of_layout. Посмотрите на Руководство по краю на Layouts and Rendering для получения дополнительных опций.

2

простое решение было бы добавить имя controller как id из bodytag из макета:

##layouts/application.html.erb 
<body id="<%= params[:controller] %>"> 
    <%= yield %> 
</body> 

В вашем JavaScript

if($('#name_of_the_controller').length) { console.log('do something') } 
2

По умолчанию, все JavaScript-файлы в папке app/assets/javascripts импортируется в файл application.js по заявлению require_tree .

//= require turbolinks 
//= require_tree . 

Это означает, все ваши файлы будут выполнены и доступны до тех пор, application.js упоминается в основной раскладке приложения

<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> 

Чтобы обойти это, удалите //= require_tree . заявление, а затем потребовать от каждого файла JavaScript отдельно по макетам просмотров, которые вы хотите использовать.

<%= javascript_include_tag 'employees', 'data-turbolinks-track' => true %> 

Второй преступник вы можете иметь проблемы с является turbolinks. Turbolinks быстрее выполняет следующие ссылки в вашем веб-приложении, используя конвейер активов Rails для кэширования активов, заменяя на области изменения.

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

Несмотря на то, что у Turbolinks есть event hooks, которые вы можете использовать для дальнейшего руководства вашим javascript-файлом, когда их нужно уволить, а когда нет, эти, к сожалению, не позволяют нам указать точную страницу, на которой мы хотим запустить сценарий.

Если ты так много об этом факте, вы можете установить 'data-turbolinks-track' => false

3

Я хочу использовать JQuery вместо CoffeeScript

JQuery !== Coffeescript 

Jquery является основой, coffeescript is a preprocessor. Они совершенно разные.

Вы можете использовать JQuery в CoffeeScript с inpunity:

#test.coffee 
$(".element").on "click", -> 
    alert "test" 

эти JS файл, кажется, должны быть доступны для всех моих контроллеров

Это связано с Sprockets Manifest Directives:

#app/assets/javascripts/application.js 
//= require_tree . 
//= require_self 

Вышеуказанная функция по умолчанию для приложения Rails.

Это означало, так что все ваш JS/CSS активы помещаются в единый application.css/application.js файл (один файл = более эффективный):

#app/views/layouts/application.html.erb 
<%= javascript_include_tag :application %> 

-

Чего вы хотите до исключить некоторые файлы из этого процесса.

Сделать это очень просто:

#app/assets/javascripts/application.js 
//= require_tree . 
//= require_self 
//= stub employees 

#app/views/layouts/application.html.erb 
<%= javascript_include_tag :application, (:employees if controller_name == "employees") %> 

#config/initializers/assets.rb 
Rails.application.config.assets.precompile += %w(employees.js employees.css) 

Вы должны включить «исключенные» файлы отдельно в вашем трубопроводе активов (как указано выше).

Смежные вопросы