首页 > 解决方案 > 从 S3 的视图中拯救 403 个禁止的图像

问题描述

我想在我的应用程序中拯救来自 S3 的每个 403 响应。它们主要在图像标签中,破坏视图中的图像。ApplicationController当图像标签没有引发异常时,我怎么能做到这一点,它们只是在视图中有损坏的图像?

rescue_from ??? do |e|
  logger.debug "broken image: #{e}"
end

一些图像在帮助器中呈现,如下所示:

def user_image(img_style)
 "<img src='#{asset.image(img_style)}' />"
end

Whereasset.image(img_style)返回一个(在这种情况下是禁止的)URL。

其他的就像:

<%= image_tag document.other_asset.image(:small) %>

ApplicationController我猜没有单个父控制器(保存)。

但是,有一个ImageAttachment存储图像的多态类 ( )。我应该事先在模型中获取它并引发错误吗?这不涉及两次提出请求吗?

标签: ruby-on-railsrubyamazon-s3

解决方案


这个解决方案绝对是可怕的,并且使每个图像的请求数量增加了一倍,但为了完成:

def found?(style = :small)
  return true if URI.open(image(style))
rescue OpenURI::HTTPError => exception
  logger.debug exception.message
  false
end

一个更好的实现显然是在 Javascript 中,因此资源不必加载两次,但由于问题始于 Ruby,它也会在那里结束。


推荐阅读