我想在我的应用程序中拯救来自 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
其中asset.image(img_style)
返回一个(在本例中为禁止的)URL。
其他的就像:
<%= image_tag document.other_asset.image(:small) %>
我猜没有单父控制器(保存ApplicationController
)。
然而,有一个多态类(ImageAttachment
)来存储图像。我应该事先在模型中获取它并引发错误吗?这不是涉及提出两次请求吗?
这个解决方案绝对是可怕的,并且使每个图像的请求数量增加了一倍,但为了完成起见:
def found?(style = :small)
return true if URI.open(image(style))
rescue OpenURI::HTTPError => exception
logger.debug exception.message
false
end
一个更好的实现显然是在Javascript中,所以资源不必加载两次,但是由于问题始于Ruby,它也会到此结束。