nil:NilClass 的 RailsAdmin Carrierwave 多重上传未定义方法“文件名”

RailsAdmin Carrierwave Multiple Upload undefined method `filename' for nil:NilClass

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

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

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

计算器溢出:

如何从此 json 数组中删除以前上传的图片?非常感谢任何帮助!

这里的问题是某些 uploaders 没有附加文件。所以你的错误是因为你在 nil 上调用 filename - 又名 uploader.file returns 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

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

希望这对您有所帮助 - 如果您有任何问题,请告诉我您的情况:)