Rails会在更改时触发特定资产的重建

时间:2015-10-26 07:24:34

标签: angularjs ruby-on-rails-4 asset-pipeline

由于an issue in the angular-rails-templates gem,我已在我的回购herehere中采用了一种建议的解决方法。

基本前提工作 - 当我修改任何JS模板时,它会触发删除缓存文件夹。

未发生的情况是,app/assets/javascripts/templates.js.erb处动态生成的Angular模板未在同一进程中重新编译。我仍然需要重新启动rails服务器以查看更改。

如何将该文件作为同一过程的一部分重新编译?

生成Angular模板缓存 (仅适用于rails服务器启动)

(function(){
  'use strict';

  angular.module('templates', []).run(['$templateCache', function($templateCache) {
    <%
      environment.context_class.instance_eval { include ActionView::Helpers::JavaScriptHelper }
      app_root  = File.expand_path('../../', __FILE__)
      templates = File.join(app_root, %w{templates ** *.html.haml})
      Dir.glob(templates).each do |f|
        key  = f.gsub(%r(^#{app_root}/templates/), '')
        key.gsub!('.haml', '')
        html = Tilt::HamlTemplate.new(f).render
        template = html.squish
    %>
      $templateCache.put("<%= key  %>", "<%= escape_javascript(template) %>");
  <% end %>
  }]);
}());

侦听任何JS模板的更改

require 'fileutils'

if Rails.env.development?
  cache_path = Rails.root.join('tmp/cache/assets/development')
  FileUtils.rm_rf(cache_path)

  listener = Listen.to(Rails.root.join('app/assets/templates')) do |modified, added, removed|
    puts 'CLEARING NG TEMPLATE CACHE'
    # clearing cache
    FileUtils.rm_rf(cache_path)
  end
  listener.start
end

1 个答案:

答案 0 :(得分:1)

Rails默认缓存FileStore使用额外的内存存储来保存文件I / O.即使没有缓存文件或目录,Rails也会继续为您提供旧内容。

要完全清理缓存,您应该在同一服务器进程中调用以下语句。

Rails.cache.clear

因此,您的侦听器代码应如下所示:

if Rails.env.development?
  listener = Listen.to(Rails.root.join('app/assets/templates')) do |modified, added, removed|
    puts 'CLEARING NG TEMPLATE CACHE'
    Rails.cache.clear
  end
  listener.start
end

如果您经常更改这些模板,那么可能会有很多使用默认缓存的创建/删除文件周期。为避免这种情况,您可以尝试将其切换到纯内存缓存。将此行添加到config/environments/development.rb

config.cache_store = :memory_store