【问题标题】:ActiveStorage Thumbnail PersistenceActiveStorage 缩略图持久化
【发布时间】:2018-06-25 22:58:10
【问题描述】:

我已将我的 Rails 应用程序迁移到 5.2.0。在我使用回形针之前。上传图像时,回形针会生成不同的变体,例如缩略图和头像。如何使用 ActiveStorage 实现这一目标?我知道我们可以做到这一点user.avatar.variant(resize_to_fit: [100, 100]) 但对我来说就像一遍又一遍地这样做。我的目标是在这些变体上传后对其进行预处理。

如果你的经验不好,你们也可以提出更好的技术。

【问题讨论】:

  • 你的方法是对的,但是你需要在你的代码中包含一个方法 .processed 所以它应该如下所示:user.avatar.variant(resize_to_fit: [100, 100]).processed
  • 这是否意味着在我调用 user.avatar.variant(resize_to_fit: [100, 100]).processed 之后,它将被保存到磁盘中,下次它只会返回变体而不返工。下次如何使用该变体?是 user.avatar.variant(resize_to_fit: [100, 100]) 还是 user.avatar.variant(resize_to_fit: [100, 100]).processed?
  • 你是对的,它会保存变体并一直使用它,你总是应该包含.processed来使用保存的变体。如果要刷新/重新生成变体,则可以使用不带.processed的代码
  • @TrongBang 如果下面推荐的答案解决了您的问题或帮助了您,您可以将其标记为解决方案吗?谢谢!

标签: ruby-on-rails rails-activestorage


【解决方案1】:

使用.processed 是检查该变体是否已被处理并上传到存储服务的正确方法。

Paperclip 做得很好的一件事是 styles: {} 对象,您可以在其中列出您想要对缩略图等进行的所有不同转换,并为它们命名。

以下是我处理命名和存储转换的方式。这也使我的模板语法更短:

class Image < ActiveRecord::Base
  has_one_attached :image_file

  def self.sizes
    {
      thumbnail: { resize: "100x100" },
      hero1:     { resize: "1000x500" }
    }
  end

  def sized(size)
    self.image_file.variant(Image.sizes[size]).processed
  end

end

然后在模板中,假设我有@image,我可以简单地调用@image.sized(:hero1)

【讨论】:

  • 只是一个小提示:不需要return
  • @aenw 公平点。我喜欢包含return,它可以舒缓我疲惫的大脑,但鉴于它不是“Ruby 方式”,我会将其从我的答案中删除。
【解决方案2】:

@aguardientico 正确的是,将 .processed 方法添加到您的变体对象中,该方法将使用 blob 键检查文件是否已存在于您的服务中,然后再尝试重新生成整个过程。

另外需要了解的是resize_to_fit 是一种 ImageProcessing gem 转换方法,Rails 5.2 尚不支持。相反,它现在使用 MiniMagick,您可以将 &gt; 附加到回形针的 resize 方法中。

所以重写它看起来像user.avatar.variant(resize: "100x100&gt;")

【讨论】:

    猜你喜欢
    • 2012-02-02
    • 2012-01-05
    • 2016-02-08
    • 2020-02-17
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多