尝试使用 ImageProcessing 时找不到活动存储文件错误

Active Storage File Not Found error when trying to use ImageProcessing

我不断得到

ActiveStorage::FileNotFoundError (ActiveStorage::FileNotFoundError):
app/models/service.rb:24:in `process_images'

尝试将图像加载到 ImageProcessing::MiniMagick 时使用 ImageProcessing::MiniMagick.source(self.image.download)

我也试过了

ImageProcessing::MiniMagick.source(self.image) ImageProcessing::MiniMagick.source(self.image.attachment) ImageProcessing::MiniMagick.source(self.image.attachment.download) ImageProcessing::MiniMagick.source(self.image.blob)

ImageProcessing 不喜欢那些,因为它正在寻找 url,所以我尝试使用 url,就像这样 url = Rails.application.routes.url_helpers.rails_blob_path(self.image, only_path: true) 并传递它而不是 self.image 当我这样做时,我得到错误

failed with error:
convert: unable to open image `rails/active_storage/blobs/foo...`

有人可以引导我朝着正确的方向前进吗?

这是我的模型的相关部分,现在看起来是这样。

class Service < ApplicationRecord
  has_one_attached :image, dependent: :destroy
  has_one_attached :featured_image, dependent: :destroy

  after_create :process_images
  after_save :process_images

  private  
  def process_images 
    url = Rails.application.routes.url_helpers.rails_blob_path(self.image, only_path: true)
    pipeline1 = ImageProcessing::MiniMagick.source(url)
    #can't continue until I load an image
  end
end

我也从控制器调用了方法。我使模型方法不是私有的并调用它,它解决了 nil 附件问题。以下但后来我收到此错误。 ArgumentError (string contains null byte): 在此行标记。 pipeline1.resize_to_limit(400,400).convert("jpg").call

我所做的只是在创建或更新实例时调整图像大小,然后将处理后的图像保存为主要附件。

根据文档 “源对象需要响应 .path,或者是 StringPathnameVips::Image/MiniMagick::Tool object,您提供的参数有none个符合要求

我的方法是获取 ActiveStorage 文件的完整路径,为此我们可以使用 ActiveStorage::Blob.service.send(:path_for, <attachment>),然后将其用作 ImageProcessing::MiniMagick.source 方法中的参数。

这就是以下内容起作用的原因:

ImageProcessing::MiniMagick.source(ActiveStorage::Blob.service.send(:path_for, self.image.key))

该问题可能与 MiniMagick 无关,而与 ActiveStorage 有关。避免在交易中附加附件,一切都会 运行 顺利。这适用于迁移、种子或回调。

为了避免我的逻辑被包裹在事务中,我最终所做的是 运行 线程中的逻辑:

Thread.new do
  # your logic here
end.join