Rails 3.1资产管道:Amazon S3上的其他资产要求预编译?

3
所以我们有一个带有资产的Rails 3.1(.1)网站,这些资产位于几个不同的位置,而且Rails(由于某种原因)期望那些托管在Amazon S3上的图像被预编译。网站特定的那些(样式表、小布局图像等)是本地的,在生产中成功地预编译,并存储在public/assets中,就像它们应该的那样。它们通过Apache很好地提供服务。
我们有一些在数据库中存储的URL指向CDN托管的图像,并且这些URL没有文件扩展名;相反,它们有一个MD5。它们通过Rails的image_tag助手在视图中提供服务,显示在生产中,它们不会被卷入我们的预编译业务中(因为它们是动态的,实际上基于我们网站上的产品页面)。
不好的是第三组资产;它们存储在Amazon S3上,与我们的网站在生产中提供服务的主机名类似(例如,网站位于store.hostname.com,而资产位于images.hostname.com.s3.amazonaws.com)。当我们访问其中一个图片的页面时(并且这些图片确实有某种扩展名;.jpg | .png | .gif等),我们会收到一个500错误,并且Sprockets错误将记录关于该图片的URL未被预编译。
我看到一些解决方案,人们向config.action_controller.asset_host提供一个Proc,但我不确定它是否适用于我的情况。我似乎找不到我的解决方案的答案。
除了将URL写入原始HTML图像标记()而不是Rails image_tag之外,还有其他方法吗?我们真的很想能够使用这些好的助手。

你是如何为S3上的图片生成URL的? - James
它们实际上是从另一个使用与此应用程序相同的数据库表的应用程序上传到那里的文件。它们作为 http://images.hostname.com.s3.amazonaws.com/path/to/image-01.png 存储在数据库中。然后将其输入到像 ERB 中的 image_tag 中: <%= image_tag(@product.image_url) %> - Ben Kreeger
1
所以 image_url 是您的 products 表中的一列,它具有像 http://images.hostname.com.s3.amazonaws.com/path/to/image-01.png 这样的值?如果您提供了路径,image_tag 应该只查找资产。我不确定为什么它会在您提供完整 URL 的情况下查找资产。 - James
是的 - 我今天早上在Github上查看了rails/rails,你说得对。如果路径是/类似于URI的话,它不应该寻找资源(https://github.com/rails/rails/blob/master/actionpack/lib/action_view/asset_paths.rb#L26)。直接使用HTML标签就可以了:<img src="<%= @product.image_url %>" /> 不太清楚为什么。 - Ben Kreeger
@James:非常感谢您的评论。如果您将其发布为答案,我会给您打分。一些URI在被传递给image_tag时前面有空格。 - Ben Kreeger
1个回答

4
据评论看,您数据库中的图像URL以空格作为第一个字符,这导致image_tag寻找资产而不是直接链接到URL。

哇,谢谢你。如果没有看到你的答案,我想我永远不会注意到这个问题。 - swilliams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接