始终使用Rail 3.1资产管道预处理特定的Javascript文件

时间:2011-10-20 00:10:13

标签: ruby-on-rails ruby-on-rails-3.1 asset-pipeline mustache

有没有办法在Javascript文件上始终运行ERB预处理器?

我正在使用Mustache在客户端和服务器上使用相同的模板。我想在我的application.js文件中包含这些模板,以便它们在客户端上可用。所以我正在使用erb预处理我的Javascript文件(templates.js.erb,然后在application.js中需要):

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

这很好但是当我编辑“product / show.html.mustache”模板时,我还需要编辑“templates.js.erb”,这样Rails就知道要重新编译这个文件,然后从胡子中获取最新的变化模板。

在生产中运行此问题没有问题,因为我在部署时会编译资产,但在开发时会很烦人。理想情况下,每次重新加载时,我都可以将预处理器设置为在“templates.js.erb”上运行。我目前的解决方案是在应用程序布局中内联Javascript,但将它保持分离会很好。

3 个答案:

答案 0 :(得分:1)

我最后为此编写了一个保护文件,它在文件末尾添加了一个时间戳。只需触摸文件就足以让链轮重新编译,但如果您使用的是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

答案 1 :(得分:0)

这似乎是管道的常见抱怨 - 您必须触摸引用变量的文件,以便在开发模式中反映这些更改。有些人提出了类似的问题,我认为没有办法解决问题。

强制Sprockets为每个请求重新编译并不是一个可行的解决方案,因为编译需要很长时间。

答案 2 :(得分:0)

也许您可以设置警卫来观察您的胡子目录,并在对其进行更改时重新编译templates.js.erb。类似于guard-bundler监视您的Gemfile并在更改时重新绑定。