我发现的最佳解决方案是不要将资产管道用于 HTML 模板文件。
而是调用一个控制器TemplatesController
并只创建一个动作。然后使用以下路由将所有模板 URL 映射到:
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
这样,您的所有模板文件都将从控制器提供,然后将缓存到 public/templates 中。为避免缓存问题,您可以在模板路由中创建时间戳路径,以便您的缓存文件随版本一起交付:
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
然后,如果没有找到它,只需将资产重定向到 Rails 服务器并生成它。或者所有模板文件可以在上传后预先生成。