Стратегия Rails 3.1 для предварительной компиляции активов JS контроллера
Чтобы исключить логику JavaScript, специфичную для контроллера, из стандартного application.js
и включить ее только соответствующим контроллером, я помещаю его в свой .js файл и включаю его на основе имени контроллера из макета например:
<%= javascript_include_tag "application", params[:controller] %>
Это работает очень хорошо, но когда я развертываю приложение для производства (я использую Capistrano и настрою предустановленную задачу), конвейер ресурсов не прекомпилирует какой-либо из JS файлов, специфичных для контроллера. Я предполагаю, что это связано с тем, что мой фактический файл JavaScript не ссылается на директивы require в application.js.
Как я могу справиться с этим, не перекладывая JS на контроллер на application.js или явно ссылаясь на него из application.js?
Есть ли какой-то способ сообщить конвейеру активов предварительно скомпилировать дополнительные файлы списка? Как я могу вручную предварительно скомпилировать определенный файл при создании?
Обновление
По мере того как получается, вы можете указать отдельные файлы здесь в config/environments/production.rb
:
config.assets.precompile += %w( achievements.js )
... или я просто пошел вперед и капризно добавил его для каждого файла JavaScript:
config.assets.precompile += %w( *.js )
Ответы
Ответ 1
Если вы хотите прекомпилировать js | css , найденный только в корневом каталоге ресурсов /javascripts и каталогов ресурсов/таблиц стилей (а не их иерархии деревьев), вы можете поместить это в файлы среды:
Dir.chdir "#{Rails.root}/app/assets/javascripts"
a = Dir.glob("*.{js,coffee,erb}")
Dir.chdir "#{Rails.root}/app/assets/stylesheets"
b = Dir.glob("*.{css,erb}")
config.assets.precompile += a.concat(b)
Dir.chdir Rails.root
Ответ 2
Я думаю, что вы и james_schorr на самом деле не говорите об одном и том же.
Вам нужно добавить файлы, отличные от application.js, в config.assets.precompile. Его ответ был больше о структуре каталогов, которую вы могли/должны принять, если я не ошибаюсь.
Если бы я хотел иметь контроллер, я бы сделал:
/assets
/javascripts
/users
login.js
profile.js
/blogs
/posts
users.js
blogs.js
posts.js
И, например, users.js
будет:
*= require_tree ./users
Таким образом, вы можете оставаться организованным (иметь много js файлов на контроллер), но в prod все они будут включены в один файл.
Еще нужно, чтобы в вашей конфигурации:
config.assets.precompile += %w( *.js )
Ответ 3
Это то, что я делаю:
Структура каталогов :
app/assets/javascripts/sessions/multiple.js
app/assets/application-sessions.js
application-sessions.js просто имеет:
*= require_self
*= require_tree ./sessions
Затем, на ваш взгляд, сделайте
<% if @current_controller == 'whatever' %>
<%= javascript_include_tag "application-sessions" %>
<% else %>
….
<% end %>
FYI, @current_controller = имя_контроллера в моих методах application_controller.rb, вызываемых с помощью before_filter.
Ответ 4
У меня такая же проблема, это головная боль для меня.
Включение *.js немного слишком много, я не хочу, чтобы все файлы были скомпилированы в отдельные файлы, некоторые из них предполагают, что они будут объединены.
Моя идея состоит в том, чтобы хранить определенные файлы контроллера в подкаталоге, например "контроллеры", а затем включать только контроллеры /*. js или файлы css для прекомпиляции.
Не уверен, что он работает или нет, я попробую, во всяком случае, это может быть полезным советом.