跳至内容 跳至搜索
方法
P
R
V

实例公共方法

preview(transformations)

返回一个 ActiveStorage::Preview 实例,包含提供的 transformations 集合。预览是从非图像 Blob 生成的图像。Active Storage 提供了针对视频和 PDF 文档的内置预览器。视频预览器从视频中提取第一帧,PDF 预览器从 PDF 文档中提取第一页。

blob.preview(resize_to_limit: [100, 100]).processed.url

避免在视图中同步处理预览。相反,链接到按需处理预览的控制器操作。Active Storage 提供了一个,但您可能想创建自己的(例如,如果您需要身份验证)。以下是如何使用内置版本

<%= image_tag video.preview(resize_to_limit: [100, 100]) %>

如果没有任何预览器接受接收的 Blob,此方法将引发 ActiveStorage::UnpreviewableError。若要确定 Blob 是否被任何预览器接受,请调用 ActiveStorage::Blob#previewable?

# File activestorage/app/models/active_storage/blob/representable.rb, line 63
def preview(transformations)
  if previewable?
    ActiveStorage::Preview.new(self, transformations)
  else
    raise ActiveStorage::UnpreviewableError, "No previewer found for blob with ID=#{id} and content_type=#{content_type}"
  end
end

previewable?()

如果任何已注册的预览器接受 Blob,则返回 true。默认情况下,这将针对视频和 PDF 文档返回 true。

# File activestorage/app/models/active_storage/blob/representable.rb, line 72
def previewable?
  ActiveStorage.previewers.any? { |klass| klass.accept?(self) }
end

representable?()

如果 Blob 是变量或可预览的,则返回 true。

# File activestorage/app/models/active_storage/blob/representable.rb, line 97
def representable?
  variable? || previewable?
end

representation(transformations)

对于可预览的 Blob 返回一个 ActiveStorage::Preview,对于可变图像 Blob 返回一个 ActiveStorage::Variant

blob.representation(resize_to_limit: [100, 100]).processed.url

如果接收的 Blob 既不是变量也不是可预览的,则引发 ActiveStorage::UnrepresentableError。调用 ActiveStorage::Blob#representable? 以确定 Blob 是否可表示。

有关更多信息,请参阅 ActiveStorage::Blob#previewActiveStorage::Blob#variant

# File activestorage/app/models/active_storage/blob/representable.rb, line 85
def representation(transformations)
  case
  when previewable?
    preview transformations
  when variable?
    variant transformations
  else
    raise ActiveStorage::UnrepresentableError, "No previewer found and can't transform blob with ID=#{id} and content_type=#{content_type}"
  end
end

variable?()

如果变体处理器可以转换 Blob(其内容类型在 ActiveStorage.variable_content_types 中),则返回 true。

# File activestorage/app/models/active_storage/blob/representable.rb, line 44
def variable?
  ActiveStorage.variable_content_types.include?(content_type)
end

variant(transformations)

返回一个 ActiveStorage::VariantActiveStorage::VariantWithRecord 实例,包含提供的 transformations 集合。这仅与图像文件相关,它允许对任何图像进行大小、颜色等的转换。示例

avatar.variant(resize_to_limit: [100, 100]).processed.url

这将创建并处理头像 Blob 的变体,该变体的高度和宽度限制为 100 像素。然后,它会根据 Blob 的派生键和转换将该变体上传到服务。

不过,通常情况下,您并不想立即转换变体。而是简单地引用一个特定的变体,该变体可以按需由控制器创建。如下所示

<%= image_tag Current.user.avatar.variant(resize_to_limit: [100, 100]) %>

这将为具有该特定变体的该特定 Blob 创建一个 URL,然后 ActiveStorage::RepresentationsController 可以按需生成该 URL。

如果变体处理器无法转换 Blob,则引发 ActiveStorage::InvariableError。若要确定 Blob 是否是变量,请调用 ActiveStorage::Blob#variable?

# File activestorage/app/models/active_storage/blob/representable.rb, line 34
def variant(transformations)
  if variable?
    variant_class.new(self, ActiveStorage::Variation.wrap(transformations).default_to(default_variant_transformations))
  else
    raise ActiveStorage::InvariableError, "Can't transform blob with ID=#{id} and content_type=#{content_type}"
  end
end