由于an issue in the angular-rails-templates gem,我已在我的回购here和here中采用了一种建议的解决方法。
基本前提工作 - 当我修改任何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
答案 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