Всегда предварительно обрабатывайте определенный файл Javascript с помощью конвейера ресурсов Rail 3.1 - PullRequest
0 голосов
/ 20 октября 2011

Есть ли способ всегда запускать препроцессор ERB для файла Javascript?

Я использую усы, чтобы использовать одни и те же шаблоны на клиенте и сервере.Я хотел бы включить эти шаблоны в мои файлы application.js, чтобы они были доступны на клиенте.Поэтому я предварительно обрабатываю свой файл Javascript (templates.js.erb, который затем требуется в application.js) с помощью erb:

App.templates.productShow = <%= MustacheController.read("product/show").to_json %>;

Это прекрасно работает, но когда я редактирую "product / show.html"Шаблон .mustache Мне также нужно отредактировать файл templates.js.erb, чтобы Rails знал, как перекомпилировать этот файл, который затем извлекает последние изменения из шаблона усов.

Нет проблем с запуском в производство, так как ресурсы компилируются при развертывании, но это раздражает при разработке.В идеале я мог бы настроить препроцессор для запуска на "templates.js.erb" каждый раз, когда я перезагружаюсь.Мое текущее решение - встроить Javascript в макет приложения, но было бы неплохо оставить его отдельно.

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Я закончил тем, что написал для этого файл защиты, который добавляет метку времени в конец файла. Одного прикосновения к файлу достаточно, чтобы звездочки перекомпилировались, но если вы используете git, вам нужно изменить файл. В противном случае любой, кто извлечет код, не получит последние предварительно обработанные файлы. Вот код ...

#!/usr/bin/ruby

guard 'mustache' do
  watch(%r{app/templates/.+\.mustache})
end


require 'guard/guard'

module ::Guard
  class Mustache < ::Guard::Guard

    def run_on_change(paths)

      # file to be updated when any mustache template is updated
      file_name = "./app/assets/javascripts/templates.js.erb"

      # get array of lines in file
      lines = File.readlines(file_name)

      # if last line is a comment delete
      lines.delete_at(-1) if lines[-1].match /\/\//

      # add timestamp
      lines << "// #{Time.now}"

      # rewrite file
      File.open(file_name, "w") do |f|
        lines.each{|line| f.puts(line)}
      end

    end

  end
end
0 голосов
/ 05 ноября 2011

Может быть, вы могли бы настроить guard, чтобы отслеживать ваш каталог усов и перекомпилировать templates.js.erb, когда вы вносите в него изменения.Подобно тому, как guard-bundler наблюдает за вашим Gemfile и восстанавливает счет при изменении.

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

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

Заставить Sprockets перекомпилировать для каждого отдельного запроса не является жизнеспособным решением, потому что сборка занимает так много времени.

...