【问题标题】:Problem uploading images in rails, carrierwave and mongoid在 rails、carrierwave 和 mongoid 中上传图像的问题
【发布时间】:2011-09-08 18:16:57
【问题描述】:

我在使用 rails 和 carrierwave 将图像上传到 mongodb 时遇到问题。这是我收到的错误消息

Cannot serialize an object of class ActionDispatch::Http::UploadedFile into BSON.

我的模型是这样的

class Offer
  include Mongoid::Document
  include Mongoid::Timestamps

  field :name, :type => String
  field :desc, :type => String
  field :expiry, :type => Date

   has_one :image, as: :viewable
  embeds_many :locations, as: :locatable
end

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

  field :name, :type => String
  field :extension, :type => String
  mount_uploader :image, ImageUploader

  belongs_to :viewable, polymorphic: true
end

视图是

<%= nested_form_for @offer, :html => {:method => :post, :id => "offerNew", :class => "uniForm", :multipart => true} do |f| %>

<fieldset class="inlineLabels" id="setBiz">
  <div class="ctrlHolder">
    <%= f.label :name, mark_mandatory("Offer Name") %>
    <%= f.text_field :name, :class => "textInput large" %>
    <p class="formHint">Name of the offer to be displayed in ads ex:5% offer on Panasonic vierra LCD </p>
  </div>

   <div class="ctrlHolder">
    <%= f.label :image, "Image" %>
    <%= f.file_field :image %>
    <p class="formHint">Upload image </p>
  </div>

</fieldset>
<% end %>

这些是发送到控制器的参数

"utf8"=>"✓",
 "authenticity_token"=>"8GhVGBg2zTI9FQwZmnKiZtBmgM5DiaQmPZaUIhNeF6I=",
 "offer"=>{"catid"=>"4e590231b356f8015f000030",
 "name"=>"aaaaaaaaaaaaaaaaaaaa",
 "expiry"=>"22/09/2011",
 "image"=>#<ActionDispatch::Http::UploadedFile:0xb412e30 @original_filename="51MF4101AA000.jpg",
 @content_type="image/jpeg",
 @headers="Content-Disposition: form-data; name=\"offer[image]\"; filename=\"51MF4101AA000.jpg\"\r\nContent-Type: image/jpeg\r\n",
 @tempfile=#<File:/tmp/RackMultipart20110908-2893-1a8yqe2>>,
 "loc"=>[80.22167450000006,
 13.0454044],
}}

但它在我手动创建这样的图像文档的另一种形式下工作正常

params[:images].each do |img|
        image = Image.new(:extension => img.content_type.split('/')[1])
        image.image = img
        @business.images << image
end

我认为carrierwave 会处理这个文件,但我不确定遗漏了什么?

【问题讨论】:

    标签: ruby-on-rails ruby mongoid carrierwave


    【解决方案1】:

    问题是您需要更新调用 mount_uploader 定义的 :image 属性,而不是调用 mount_uploader 的 Image 模型。换句话说,您需要更新 Offer.image.image 而不是 Offer.image。

    这应该可行:

       **** snip ****
    
       <div class="ctrlHolder">
        <%= f.fields_for Image.new do |i| %>
          <%= i.label :image, "Image" %>
          <%= i.file_field :image %>
        <%= end %>
        <p class="formHint">Upload image </p>
      </div>
    
      **** snip ****
    

    【讨论】:

      【解决方案2】:

      我必须承认我不熟悉nested_form_for。此外,调试您的示例有点令人困惑,因为两个模型都有 :name 和 :image 作为字段。

      在我的示例中,一个项目有_many 张照片。在新视图中,我要求一个项目有一张照片。我认为 fields_for 可能会有所作为?

      控制器:

      @item = Item.new
      @photo = @item.photos.build
      

      查看:

      <%= form_for(@item, :multipart=>true) do |f| %>
      <h3>Photo</h3>
      <div class="photo">
        <%= f.fields_for :photos do |ff| %>
        <%= ff.file_field :file %>
      <% end %>
      </div>
      <% end %>
      

      【讨论】:

      • 是的,这很令人困惑,您可以将 Image doc (mount_uploader :image, ImageUploader) 中的 image 字段更改为 (mount_uploader :asset, ImageUploader).. 而 nested_form_for 是一个表单插件,用于创建动态嵌套表单苍蝇...我也用常规的forms_for进行了验证,它不起作用:(
      猜你喜欢
      • 2015-10-22
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多