1

我花了很多时间尝试将文件附加到 mongoid 回形针字段中。我发现的例子总是做同样的事情:

my_model_instance = MyModel.new
file = File.open(file_path)
my_model_instance.attachment = file
file.close
my_model_instance.save!

正如您在如何使用 Paperclip 以编程方式设置文件上传中所见。

我做的模型是:

class Logotype
    include Mongoid::Document
    include Mongoid::Paperclip

    has_mongoid_attached_file :logo,
      styles: {large: ['640x160'], small: ['300x300>']},
      size: { in: 0..3.megabytes },
      content_type: [ "image/jpg", "image/png", "image/bmp" ],
      storage: :filesystem,
      path: ':rails_root/public/resource/resources/:id/:style.:extension',
      url: '/logos/resources/:id/:style.:extension'

    validates_presence_of :logo
    validates_uniqueness_of :logo
end

但是我总是犯同样的大错误:

NoMethodError: undefined method `__bson_dump__' for /logos/resources/51b5bfaa69fd8a7941000005/original.jpg?1370865578:Paperclip::Attachment
...

有人可以帮助我吗?提前致谢!

PD:对不起我的英语水平。

4

1 回答 1

0

这是一个老问题,但我只是想我会分享我的解决方案,以防其他人发现自己在这里。

对我来说,这发生在Moped::BSON::Extensions::Hash模块中,同时尝试记录保存操作的请求。您的堆栈可能不同,但基本上在尝试转储 Mongoid 不知道如何处理的数据时会出现问题。在我的情况下,它是一个文件上传ActionDispatch::Http::UploadedFile,但对于 OP,它是一个Paperclip::Attachment.

我通过从请求参数中删除那些键/值对来解决它,例如

   # recursively remove UploadedFile from a Hash of request parameters 
   def remove_files(params)
      p = proc do |_, v|
        v.delete_if(&p) if v.respond_to? :delete_if
        v.is_a?(ActionDispatch::Http::UploadedFile)
      end
      params.delete_if(&p)
    end

可能有更好的解决方案可以记录文件名或其他内容,但我发现摆脱它更容易。

于 2018-08-01T02:43:32.927 回答