2016-08-19 2 views
0

В моем приложении много контроллеров, а Rails создает файл css и js (coffee) для каждого контроллера.Rails загружает все файлы JS, а не только определенные контроллером

Из того, что я понимаю, Rails загружает только JS-файл контроллера (http://guides.rubyonrails.org/v3.2.8/asset_pipeline.html#how-to-use-the-asset-pipeline).

У меня есть контроллер обратной связи и в представлении я загружаю и внешнюю JS-библиотеку с javascript_include_tag. В feedback.js я использую эту библиотеку. Прекрасно работает.

Но теперь, если я перехожу к другому контроллеру, я получаю ошибку JS, говоря, что функция, используемая в feedback.js, не найдена.

Почему Rails пытается загрузить мою обратную связь.js, если im не в контроллере обратной связи?

+0

Какую версию Rails вы используете? Вы связали полуархаическую версию руководства Rails. Тем не менее, ваша версия включает в себя следующее: «Начиная с версии 3.1, по умолчанию Rails объединяет все файлы JavaScript в один файл master.js и все файлы CSS в один мастер-файл .css». См. [Связанный вопрос] (http://stackoverflow.com/questions/38753945/rails-css-stylesheets-overriding-each-other/38754089#38754089), если вам действительно нужны отдельные активы JS для каждого контроллера. – MarsAtomic

ответ

1

Контейнер ресурсов Rails не загружает определенные JS-файлы контроллера для каждого контроллера. Он загружает все файлы JS, необходимые в application.js на каждой странице. По соглашению он создает файл JS, названный для ресурса при создании нового ресурса, чтобы помочь вам организовать ваш JS-код, относящийся к представлениям каждого контроллера. Но опять же, этот JS-код загружается на каждую страницу, которая по умолчанию использует application.js.

Вы можете создавать JS-файлы с контроллером, но вы должны определить их в разделе прекомпиляции application.rb и убедитесь, что они также не включены в application.js.

Пример:

application.rb:

module YourApp 
    class Application < Rails::Application 
    # ... 
     config.assets.precompile += %w(feedback.js) 
    end 
    end 
end 

Тогда в вашем application.js вы должны удалить //= require feedback, который будет держать feedback.js от загрузки по умолчанию. Наконец, вы должны вручную включить feedback.js в представлениях, которые нуждаются в нем с javascript_include_tag, так же, как вы делаете свою дополнительную библиотеку.

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