2013-04-30 66 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)