使用mongoid-paperclip gem上传时未定义的方法'元数据'

时间:2011-06-10 21:45:05

标签: ruby-on-rails-3 paperclip mongoid

在尝试使用Mongoid和Paperclip上传文件时,无法找到原因。

undefined method `metadata' for #<ActionDispatch::Http::UploadedFile:0x10625e930>

我正在运行以下(最新的paperclip,mongoid-paperclip和aws-s3):

gem "rails", "3.0.6"
gem "mongoid", "2.0.1"
gem "bson_ext", "1.3.0"
gem "paperclip"
gem "mongoid-paperclip", :require => "mongoid_paperclip"
gem "aws-s3",            :require => "aws/s3"

我见过有些地方建议将以下内容添加到初始化程序中,以用于看似相似的内容。我做到了这一点,但无济于事。

if defined? ActionDispatch::Http::UploadedFile
    ActionDispatch::Http::UploadedFile.send(:include, Paperclip::Upfile)
end

其他人遇到过这个吗?

2 个答案:

答案 0 :(得分:1)

我有上传者:

class Image
  include Mongoid::Document
  embedded_in :imageable, polymorphic: true
  mount_uploader :file, ImageUploader
end

在我的所有包含图像的类中都使用了它,例如:

class Shop
  include Mongoid::Document
  embeds_one :logo, as: :imageable, :class_name => 'Image', cascade_callbacks: true  
end

然后在表单中看起来像这样:

<%= form_for @shop do |f| %>
  <%= f.fields_for :cover do |u|%>
    <%= u.file_field :file %>
  <% end %>
  <%= f.submit 'Save' %>
<% end %>

我认为这是处理问题的一种非常巧妙的方式。

答案 1 :(得分:0)

正如我上面所说,我遇到类似Mongoid, Carrierwave 和GridFS的问题。
我的解决方案是超级hacky,但它对我有用 我有一个Image类,这是我的图像安装的地方

class Image
  include Mongoid::Document
  include Mongoid::Timestamps

  field :title
  field :image
  field :order

  mount_uploader :image, ImageUploader
  embedded_in :article
end

class Article
  include Mongoid::Document
  ...
  embeds_one :image
  ...
end

我的carrierwave上传器需要使用mount uploader(image)的键发送给它的属性。

Image.create( :image => image_attributes)

但文章的新/编辑表单创建了一些看起来像:

:article => { :image => #ActionDispatch... }

而不是

:article => { :image => { :image => #ActionDispatch... } }

所以我的解决方案是将表单中字段的名称更改为

file_field :article, :photo

然后将照片设定器添加到创建图像的文章类

model Article
  include Mongoid::Document
  ...
  def photo=(attrs)
    create_image(:image => attrs)
  end
end

我用image =尝试了这个,但它无限地递归并做了邪恶的事情 我也试过这个

file_field "article[image]", :image

没有setter并且它没有引发异常,但它也没有保存我的图像。

据我所知,回形针在这些方面非常相似。也许这适用于某人或某人可以清理我的烂摊子