如何更改Rails asset_tag URL的格式?

时间:2010-12-22 14:33:55

标签: ruby-on-rails ruby amazon-web-services amazon-cloudfront

背景

我目前正在开发一个Rails 3项目,我打算与Amazon CloudFront一起使用,其中一个自定义源指向我的实际Web服务器。这意味着我的Web服务器将告诉浏览器从CloudFront检索静态资产,如果CloudFront已缓存资产,它将返回它,如果不是,它将使用来自我的Web服务器的相同路径检索它,然后将其缓存以备将来使用请求。

问题

Amazon CloudFront在确定是否应该破坏其自己的缓存以从其来源重新下载资产时,会删除并忽略查询字符串参数。这显然会导致Rails使用RAILS_ASSET_ID生成URL的方式出现问题:/assets/path/to/asset.ext?RAILS_ASSET_ID。使用默认资产URL,CloudFront将保留过时资产长达24小时。

解决方案吗

我希望以某种方式覆盖Rails 3生成资产标签的方式,以便生成/assets/RAILS_ASSET_ID/path/to/asset.ext之类的网址。我已经有了一个如何使Web服务器响应这些URL的解决方案,我只需要弄清楚如何让Rails生成URL。

备注

  1. 我的RAILS_ASSET_ID将是我最新的git commit hash的子字符串。设置此项将在部署过程中由capistrano处理。 我可以在每个部署中清除所有资产缓存,我不需要特定于资产的ID
  2. 我已经尝试覆盖ActionView::Helpers::AssetTagHelper.rewrite_asset_path,但它似乎没有用,而且从我读到的这是一个不应该依赖的私有方法。
  3. 提前谢谢你!

2 个答案:

答案 0 :(得分:4)

“将ActionController::Base.config.asset_path设置为采用未修改资产路径的proc,并返回资产缓存工作所需的路径。”

这来自AssetTagHelper文档。

答案 1 :(得分:1)

asset_id plugin应解决您的问题。它支持Amazon S3和CloudFront。