0

按照 Carrierwave 和 RailsAdmin 的说明,我可以使用 aws S3 在 RailsAdmin 中使用 Carrierwave 进行多次上传。尝试删除我得到的图像之一时:

undefined method 'filename' for nil:NilClass

assets 字段是一个 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但读到在使用雾 aws S3 时uploader.file.filename应该使用。

到目前为止我的资源:

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

载波: https ://github.com/sferik/rails_admin/wiki/CarrierWave

Stackoverflow: Rails Admin - 使用 Carrierwave 多次上传的未定义方法“”

如何从此 json 数组中删除以前上传的图像?任何帮助深表感谢!

4

1 回答 1

1

这里的问题是某些uploaders 没有附加文件。所以你的错误是因为你正在调用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

否则,您需要走的路线将验证上传器上是否存在文件,这可能是一个单独的问题。

希望这会有所帮助 - 让我知道你的进展情况,或者如果你在这里有任何问题 :)

于 2019-09-24T07:53:22.970 回答