有没有办法在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,但将它保持分离会很好。
答案 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并在更改时重新绑定。