我在我的 Rails 应用程序中遇到了一个非常奇怪的错误。我正在使用 ActiveStorage 在 S3 上存储图像,图像有时会出现,但有时不会。
如果向下滚动一点,一张卡片(“瑜伽撤退”)没有缩略图。
我的代码:
<a href="#" style="background-image: url('<%= rails_representation_path(experience.thumbnail) %>')">
Run Code Online (Sandbox Code Playgroud)
经验.rb
def thumbnail
self.cover.variant(resize: "300x300").processed
end
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
更新
当我部署时,问题就消失了(我可以看到图像),即使更改与图像无关。如果我再添加另一张卡,图像不会再次出现,除非我再次部署。
更新 2 我发现了问题,但我不知道如何解决。问题是缓存。它与 ActiveStorage 无关。该图像未显示,因为它指向旧 url。事实上,如果我清除缓存,一切正常。
在我看来,我使用集合片段缓存
<%= render partial: :experience, collection: @experiences, cached: true %>
Run Code Online (Sandbox Code Playgroud)
为什么当我更新我的记录时它没有更新?我注意到它不仅不会更新我的图像,而且如果我更改它,它也不会更新我的标题。
我是第一次使用ActiveStorage。在开发过程中一切正常,但在生产中(Heroku),我的图像无故消失了。
他们第一次显示正常,但现在没有图像显示。在控制台中,我可以看到此错误:
GET https://XXX.s3.amazonaws.com/variants/Q7MZrLyoKKmQFFwMMw9tQhPW/XXX 403 (Forbidden)
Run Code Online (Sandbox Code Playgroud)
如果我尝试直接访问该URL,则会得到一个XML
<Error>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<X-Amz-Expires>300</X-Amz-Expires>
<Expires>2018-07-24T13:48:25Z</Expires>
<ServerTime>2018-07-24T15:25:37Z</ServerTime>
<RequestId>291D41FAC6708334</RequestId>
<HostId>lEVGuwA6Hvlm/i40PeXaje9SEBYks9+uk6DvBs=</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)
这就是我的看法
<div class="cover" style="background-image: url('<%= rails_representation_path(experience.thumbnail) %>')"></div>
Run Code Online (Sandbox Code Playgroud)
这就是我在模型中所拥有的
def thumbnail
self.cover.variant(resize: "300x300").processed
end
Run Code Online (Sandbox Code Playgroud)
简而言之,我不希望图像过期,而是一直在那里。
谢谢