Стратегия Rails 3.1 для предварительной компиляции специфичных для контроллера ресурсов JS - PullRequest
21 голосов
/ 15 сентября 2011

Для того, чтобы логика 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 )

Ответы [ 4 ]

7 голосов
/ 11 января 2012

Если вы хотите предварительно скомпилировать js | css , найденную только в корне каталогов assets / javascripts и assets / stylesheets (а не их иерархии дерева), вы можете поместить это в файлы среды:

  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
5 голосов
/ 15 сентября 2011

Я думаю, что вы и 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 )
4 голосов
/ 15 сентября 2011

Вот что я делаю:

структура каталогов:

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 %>

К вашему сведению, @current_controller = имя_управления в моих методах application_controller.rb, вызванных с помощью before_filter.

0 голосов
/ 18 октября 2011

У меня такая же проблема, для меня это головная боль.

Включая * .js - это слишком много, я не хочу, чтобы все файлы были скомпилированы в отдельные файлы, некоторые из них предполагают слияние вместе.

Моя идея заключается в том, чтобы хранить файлы, относящиеся к контроллеру, в подкаталоге, таком как «контроллеры», а затем включать только файлы controllers / *. Js или css для прекомпиляции.

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

...