【问题标题】:RailsAdmin Carrierwave Multiple Upload undefined method `filename' for nil:NilClassRailsAdmin Carrierwave 多次上传未定义的方法 `filename' for nil:NilClass
【发布时间】:2020-01-24 07:01:40
【问题描述】:

按照 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,但读到在使用fog aws S3 时应该使用uploader.file.filename

到目前为止我的资源:

Rails 管理员 https://github.com/carrierwaveuploader/carrierwave/blob/master/README.md#multiple-file-uploads

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

堆栈溢出: Rails Admin - undefined method `' for using Carrierwave multiple upload

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

【问题讨论】:

    标签: carrierwave rails-admin


    【解决方案1】:

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

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

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

    【讨论】:

    • 第二部奏效了。删除所有缺少文件的资产有效!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2012-10-17
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多