我正在使用AngularJS和Rails构建一个网站.我用于模板的
HTML文件存储在/ app / assets / templates下,每次更新路由或更改模板内部嵌套的部分内容时,我需要“触摸”最高级别的文件/ app / assets / templates目录为我正在更改的html文件.
所以如果我有一个页面“edit.html”加载了一个部分“_form.html”,那么每当我更新一个路线或者改变_form.html中的某些东西,我需要确保edit.html被触摸.
这很烦人,很厉害.有没有办法通知资产管道/链轮,以避免缓存app / assets / templates目录?
解决方法
我发现的最好的解决方案是不要将资源管道用于HTML模板文件.
而是做一个名为TemplatesController的控制器,并且只创建一个操作.
然后将所有模板网址映射到使用以下路由的模板:
get /templates/:path.html => 'templates#page',:constraints => { :path => /.+/ }
然后将所有模板文件移动到app / views / templates中
然后在控制器内部,设置以下内容:
caches_page :page def page @path = params[:path] render :template => 'templates/' + @path,:layout => nil end
这样,您的所有模板文件将从控制器提供,然后将缓存到公共/模板中.为了避免缓存问题,您可以在模板路径中创建一个时间戳记路径,以便您的缓存文件随版本一起提供:
get '/templates/:timestamp/:path.html' => 'templates#page',:constraints => { :path => /.+/ }
这样,您可以在每次上传网站时拥有新的时间戳,并且可以将模板文件夹存储在任何您喜欢的位置.您甚至可以在S3上存储模板文件夹,并具有该资源的URL.然后,无论您的模板文件被寻址,您都可以使用自定义资产方法:
templateUrl : <%= custom_asset_template_url('some/file.html') %>
哪里:
def custom_asset_template_url(path) "http://custom-asset-server.website.com/templates/#{$some_global_timestamp}/#{path}" end