Стратегия 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 для прекомпиляции.

Не уверен, что он работает или нет, я попробую, во всяком случае, это может быть полезным советом.