Проблема с загрузкой изображений в рельсы, в транспортную волну и в mongoid - PullRequest
4 голосов
/ 08 сентября 2011

У меня проблема с загрузкой изображения в mongodb с использованием rails и carrierwave. Это сообщение об ошибке, которое я получаю

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 позаботится об обработке этого файла, но я не уверен, что пропущено?

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Проблема в том, что вам необходимо обновить атрибут: image, определенный при вызове mount_uploader, а не модель Image, в которой вызывается mount_uploader.Другими словами, вам нужно обновить 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 ****
0 голосов
/ 08 сентября 2011

Должен признать, что я не знаком с nested_form_for.Кроме того, это немного сбивает с толку при отладке вашего примера, потому что обе модели имеют: name и: image в качестве полей.

В моем примере Item has_many photos.В новом представлении мне требуется, чтобы у предмета было одно фото.Я думаю что эти поля_ могут иметь значение?

Контроллер:

@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 %>
...