Ошибка Active Storage File Not Found при попытке использовать ImageProcessing - PullRequest
1 голос
/ 02 августа 2020

Я продолжаю получать

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

Я также вызвал метод из контроллера. Я сделал метод модели не частным и вызвал его, и он решил проблему с нулевым вложением. Следующее, но затем я получаю эту ошибку. ArgumentError (string contains null byte): помечено в этой строке. pipeline1.resize_to_limit (400,400) .convert ("jpg"). call

Все, что я пытаюсь сделать, это изменить размер изображения при создании или обновлении экземпляра, а затем сохранить обработанное изображение как основное. вложение.

1 Ответ

1 голос
/ 02 августа 2020

Согласно документации "Исходный объект должен отвечать на .path или быть String, Pathname или Vips::Image/MiniMagick::Tool object" , ни один из указанных вами аргументов отвечает требованиям.

Мой подход заключался в том, чтобы получить полный путь к вашему файлу ActiveStorage, для этого мы можем использовать ActiveStorage::Blob.service.send(:path_for, <attachment>), а затем использовать его как аргумент в методе ImageProcessing::MiniMagick.source.

Поэтому работает следующее:

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