尝试使用 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
,或者是 String
、Pathname
或 Vips::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
我不断得到
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
,或者是 String
、Pathname
或 Vips::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