获取 Active Storage 变体的元数据

Get metadata of Active Storage variant

我有一个 Active Storage 映像变体,例如

<%= image_tag model.logo_image.variant(resize_to_fit: [300, 200]) %>

我正在尝试获取此变体的 widthheight 值(因为它们未知)以用于 widthheight HTML属性。

我预计他们会在这里:

model.logo_image.variant(resize_to_fit: [300, 200]).processed.blob.metadata

但这给了我原始文件的元数据,而不是调整大小的变体,例如

{"identified"=>true, "width"=>800, "height"=>174, "analyzed"=>true}

如何获取 Active Storage 变体的维度?

使用 Rails 6.1,最终所有变体都存储在一个新的 model/database table 中,每个变体都带有一个 Blob。如果此功能与您相关,请尝试升级。

非常深入对象,然后您可以找到变体 blob,从而找到元数据!

尝试:

model.logo_image.
 variant(resize_to_fit: [300, 200]).
 processed.send(:record).image.blob.metadata

它第一次不起作用,当第一次调用时,它没有 width/height,因为 AnalyzeJob 将异步 运行,它会添加 width/height"稍后”,具体取决于您的队列设置。

也许添加一个 helper_method 来创建具有宽度和高度的图像(如果可用):

module ApplicationHelper
  def image_tag_for_attachment_with_dimensions(variant, opts = {})
    if variant.processed?
      metadata = variant.processed.send(:record).image.blob.metadata
      if metadata['width']
        opts[:width] = metadata['width']
        opts[:height] = metadata['height']
      end
    end
    image_tag variant, opts
  end
end

# usage: 
= image_tag_for_attachment_with_dimensions model.logo_image.variant(resize_to_fit: [300, 200])