ruby-on-rails - ActiveStorage-Safari缓存的附件

标签 ruby-on-rails ruby vue.js rails-activestorage

我将ActiveStorage与默认磁盘服务一起使用。我的api返回图像URL,并且图像通过IMG标签嵌入在前端(Vue.js)中。当我打开图片网址时,图片会正确显示。

render json: {
  image_url: rails_blob_path(user.photo, only_path: true),
  ....
}
<a :href="image_url">
  <img :src="image_url">
</a>
当我查看源代码时,Safari一直尝试调用旧的URL。 5分钟后将不再可能。
我试图直接在初始化程序中设置config.active_storage.service_urls_expire_in,但这没有效果:
# config/initializers/active_storage.rb
Rails.application.config.active_storage.service_urls_expire_in = 1.week
当我以默认的导轨方式放置图像时,图像将获得不同的URL,并且它不会过期:
image_tag(user.photo)
# => <img src=".../rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhjM2w1WlhSbGNtMWxOVEJvWW1kdE1YRm9ObW96TjNvd2IzTjNjd1k2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpYjJsdWJHbHVaVHNnWm1sc1pXNWhiV1U5SW1wdlkzSmZhV052Ymw5amFHRjBYMnB2WTNJdWFHbHNablJmWW14aGRTNXdibWNpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSjJwdlkzSmZhV052Ymw5amFHRjBYMnB2WTNJdWFHbHNablJmWW14aGRTNXdibWNHT3daVU9oRmpiMjUwWlc1MFgzUjVjR1ZKSWc1cGJXRm5aUzl3Ym1jR093WlUiLCJleHAiOiIyMDIwLTA3LTAzVDA5OjQ4OjQyLjc0NFoiLCJwdXIiOiJibG9iX2tleSJ9fQ==--d23e3bb8161f54cce48a3d13a60d906c18574569/user_photo.png" />
rails_blob_path(user.photo, only_path: true)
# => ".../rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBkQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--23e3b6283c346c75d7e6c1e769eacb6d428fec0e/user_photo.png"
是否可以在api中使用image_tag的URL?
Ruby版本:2.7.0
Rails版本:6.0.2.2

最佳答案

我遇到了同样的问题,所以我以以下解决方案告终。
您的系统可能有所不同,因为我为每个图像都有一个图像模型,因此也能够将图像重用于其他条目。
因此,我向Image模型和media -route添加了唯一 token 。
GET https://my-domain.com/media/thumb/V8sPcDSNmMqrCRybXYLVRpoR
media_controller:

def show
  return head :not_found if origin.blank?

  send_file path, type: origin.content_type, disposition: :inline
rescue ActionController::MissingFile, NoMethodError
  redirect_to fallback
end

private

def origin
  @origin ||= Image.find_by(token: params[:token])
end

def path
  @path ||= origin.local_path(params[:size])
end

...
图片:
...

def local_path(size = :medium)
  img = image_with_size(size)
  ActiveStorage::Blob.service.path_for(img.key) if img.present?
end

def content_type
   file.blob&.content_type || 'image/png'
end

...
image_with_size仅返回文件的请求变体。
也许我的方法对您的系统也有帮助。

关于ruby-on-rails - ActiveStorage-Safari缓存的附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62593044/

相关文章:

ruby-on-rails - 选择产品的属性,例如尺寸/颜色,而无需创建模型来处理它们

ruby-on-rails - 如何在 ruby​​ Test::Unit 框架中运行单个 shoulda 上下文测试

ruby-on-rails - 如果通过逻辑语句,如何将项目添加到数组中?

javascript - 使用vue.js和vee-validate,在: and a computed field doesn't seem to work之后使用日期验证

ruby-on-rails - 在 Ruby on Rails 3 中制作通用模型时出现问题

python - Ruby 正则表达式与 Python 正则表达式

ruby-on-rails - Rails 分页 - 更快地计算总页数?

javascript - 基于元素样式的 RJS 条件 - Ruby on rails

django - 无法获取 request.FILES django

ios - 滚动我的应用程序时如何在 IOS 中禁用触摸事件 (Cordova)