RailsAdmin Carrierwave Multiple Upload неопределенный метод `имя файла 'для nil: NilClass - PullRequest
0 голосов
/ 24 сентября 2019

Следуя инструкциям Carrierwave и RailsAdmin, я могу предварительно выполнить несколько загрузок в RailsAdmin с помощью Carrierwave, используя aws S3.При попытке удалить одно из изображений я получаю:

undefined method 'filename' for nil:NilClass

Поле активов является полем json, assets:json

Это в моей модели:

attr_accessor :delete_assets
  after_validation do
    uploaders = assets.delete_if do |uploader|
      if Array(delete_assets).include?(uploader.file.filename)
        uploader.remove!
        true
      end
    end
    write_attribute(:assets, uploaders.map { |uploader| uploader.file.filename })
  end

Я пытался uploader.file.identifier, но читал, что при использовании fog aws S3 следует использовать uploader.file.filename.

Мои ресурсы на данный момент:

RailsAdmin https://github.com/carrierwaveuploader/carrierwave/blob/master/README.md#multiple-file-uploads

Carrierwave: https://github.com/sferik/rails_admin/wiki/CarrierWave

Stackoverflow: Rails Admin - неопределенный метод `'для использования множественной загрузки Carrierwave

Как удалить ранее загруженныйизображение из этого массива JSON?Любая помощь очень ценится!

1 Ответ

1 голос
/ 24 сентября 2019

Проблема в том, что uploader не имеет прикрепленного файла.Итак, ваша ошибка в том, что вы звоните filename на nil - он же uploader.file возвращает nil.

Вы, вероятно, захотите обработать это вхождение, что-то вроде следующего:

  attr_accessor :delete_assets

  after_validation do
    uploaders = assets.delete_if do |uploader|
      next unless uploader.file # <-- skip deleting assets without a file

      if Array(delete_assets).include?(uploader.file.filename)
        uploader.remove!
        true
      end
    end
    write_attribute(:assets, uploaders.map { |uploader| uploader.file.filename })
  end

Или, если вы предпочитаете удалить все активы, в которых отсутствует файл:

  attr_accessor :delete_assets

  after_validation do
    uploaders = assets.delete_if do |uploader|
      next true unless uploader.file # <-- note 'true' added here

      if Array(delete_assets).include?(uploader.file.filename)
        uploader.remove!
        true
      end
    end
    write_attribute(:assets, uploaders.map { |uploader| uploader.file.filename })
  end

В противном случае маршрут, по которому вам нужно пройти, будет проверять наличие.файла на загрузчике, который, вероятно, является отдельным вопросом.

Надеюсь, это поможет - дайте мне знать, как у вас обстоят дела или если у вас есть какие-либо вопросы здесь:)

...