2013-04-30 34 views
3

我有一个从配置文件加载YAML的js.erb文件。问题是Rails /资产管道将缓存结果,并且永远不会使缓存失效,即使在我更改YAML文件内容时也是如此。我可以重新启动导轨服务器,甚至重新启动机器无济于事。我迄今发现的唯一解决方法是执行“rake assets:clean”。如何判断js.erb依赖于YAML文件的Rails /资产管道?

我想找到一种方法来告诉资产管道,当YAML文件发生变化时,它需要重新计算我的js.erb。或者,也可以告诉它它只能在rails服务器的生命周期中缓存js.erb /确保在每次rails服务器启动或重新启动时都会发生重新生成。

任何建议将不胜感激。

+0

另一个解决方法是_更改YAML加载文件的内容(在某处添加或删除空间)。但是你的答案看起来是一个很好的完整解决方案。 – Arsen7 2013-08-01 13:08:46

回答

0

我觉得你有2种选择:

  1. 禁用资产管道,让Rails的做编辑在旅途中(坏的性能)

  2. 创建一个守护进程,从Rails的分离(寻找Ruby Daemon)来查找该特定文件中的任何更改并重新编译资产。

3(额外!)。删除js-YAML依赖关系,并从AJAX调用中读取YAML的内容。该场景是:JS进行AJAX调用,控制器读取YAML文件并将其内容返回给JS文件。所以不需要重新编译或监视YAML文件中的更改。

  • 如果您选择3,不要读取控制器中的YAML,请创建一个实用程序类来执行此操作,并让控制器请求该类读取该文件并传递其内容。
+0

如上所述,对于选项1,问题在于它对性能不利。对于选项2,重新编译所有资产将花费太长时间,或者如果您建议只重新编译单个更改的资产,我不明白您如何执行此操作的建议。选项3看起来很有希望,我会试试看,但似乎有一个更清晰的方式来做到这一点。另外,你能否提供一个更具体的例子来说明你对选项3的想法? – user2337118 2013-05-01 16:09:43

4

添加到这个下配置/初始化文件,它会告诉资产管道重新计算加载的YAML数据js.erb文件时的后盾YAML文件的一个变化:

class ConstantsPreprocessor < Sprockets::Processor 
    CONSTANTS_ASSET = "support/constants" 

    def evaluate(context, locals) 
    if (context.logical_path == CONSTANTS_ASSET) 
     Constants.load_path.each do |dir| 
     dir.each do |yml| 
      next unless yml.end_with?".yml" 
      context.depend_on("#{dir.path}/#{yml}") 
     end 
     end 
    end 

    data 
    end 
end 

Rails.application.assets.register_preprocessor(
    'application/javascript', 
    ConstantsPreprocessor)