所以我们有一个带有资产的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之外,还有其他方法吗?我们真的很想能够使用这些好的助手。
我们有一些在数据库中存储的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图像标记(
http://images.hostname.com.s3.amazonaws.com/path/to/image-01.png
存储在数据库中。然后将其输入到像 ERB 中的 image_tag 中:<%= image_tag(@product.image_url) %>
。 - Ben Kreegerimage_url
是您的products
表中的一列,它具有像http://images.hostname.com.s3.amazonaws.com/path/to/image-01.png
这样的值?如果您提供了路径,image_tag
应该只查找资产。我不确定为什么它会在您提供完整 URL 的情况下查找资产。 - Jamesrails/rails
,你说得对。如果路径是/类似于URI的话,它不应该寻找资源(https://github.com/rails/rails/blob/master/actionpack/lib/action_view/asset_paths.rb#L26)。直接使用HTML标签就可以了:<img src="<%= @product.image_url %>" /> 不太清楚为什么。 - Ben Kreegerimage_tag
时前面有空格。 - Ben Kreeger