有没有办法在Rails 3.0中生成精灵(运行时精灵)?

时间:2011-06-26 15:22:34

标签: ruby-on-rails-3 caching css-sprites

我的项目中的任何HTML页面都包含两种类型的图像:

  1. 系统定义的图像,例如徽标,图标和按钮
  2. 用户定义的图像,如用户的个人资料图片或公司徽标等。
  3. 在列表页面上,通常会呈现两种类型图像的组合。现在我想要的是,使用Rails,所有图像都在运行时编译到一个或两个大精灵上,具体取决于用户图像列表或给定页面中呈现的图标/徽标列表。通过这样做,我可以避免使用img标签和深度嵌套的锚点,这些锚点传统上会出现在传出的html中。

    通过后台CSS发送用户图像比img标签快X倍,让我保持html / haml干净。如果有人也可以在运行时sprite时建议我缓存问题,那会很棒吗? (如果这个东西存在,首先。)

1 个答案:

答案 0 :(得分:1)

我不知道在Ruby中以编程方式创建sprite的方法。您可能可以使用库进行图像处理(可能是FreeImage),但这似乎相当低级别。如果您发现任何可以执行此操作的内容,请随时发布。

CSS精灵是一个图像,因此动态创建图像的常用缓存规则适用。如果你不小心,浏览器将继续使用缓存副本,用户将永远不会看到精灵的新版本。解决这个问题的几种方法是:

  • 使用cache-control HTTP标头字段为图像设置合理的超时值。我尝试过这种方法,但无法使其正常工作。

  • 每次重新创建时,为图像指定一个唯一的名称。在这种情况下,图像设置为永不过期。如果重建,则会为其指定一个新名称,从而导致浏览器对其发出新请求。我成功地使用了它。 Rails对您的样式表和javascript文件做了同样的事情。

  • 另一种选择可能是使用ETags。每个版本都有一个新的,唯一的ETag,浏览器使用它来确定它是应该使用缓存副本还是获取最新版本。我以前没用过这个,但看起来它可能适合你的问题。

A related question on caching can be found here