Рельсы 3, монгоид, несущая волна, форма вложенного объекта - PullRequest
1 голос
/ 17 сентября 2011

Я использую carrierwave для загрузки фотографий в модель мира. Я не могу понять, как правильно загрузить форму:

class World
  include Mongoid::Document
  embeds_many :photos
  accepts_nested_attributes_for :photos
end

class Photo
  include Mongoid::Document

  mount_uploader :image, WorldPhotoUploader

  embedded_in :world
end


# show.haml
= form_for world, :html => {:multipart => true} do |f|
  = f.fields_for world.photos.build do |photo|
    = photo.file_field :image

Это дает мне эту форму ввода:

<input id="world_photo_image" name="world[photo][image]" type="file">

Что не работает, я получаю

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

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"e2PzZlSY0NwiCqDWn7ZMNwqnypP+GC23PcMuy+uGyF0=",
 "world"=>{"photo"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x00000103182ac8 @original_filename="Black Box fish.jpg",
 @content_type="image/jpeg",
 @headers="Content-Disposition: form-data; name=\"world[photo][image]\"; filename=\"Black Box fish.jpg\"\r\nContent-Type: image/jpeg\r\n",
 @tempfile=#<File:/var/folders/IY/IY7PGAf2F9OD6CIKr1RQo++++TI/-Tmp-/RackMultipart20110917-57084-zwoyfy>>}},
 "commit"=>"Upload",
 "id"=>"pluto"}

Кажется, что работает ввод:

<input id="world_photo_image" name="world[photos][][image]" type="file">

Но я не уверен, как создать форму, чтобы получить это

Ответы [ 2 ]

1 голос
/ 31 мая 2012

У меня есть это (с вашими именами):

 <%= form_for @world, :multipart => true do |f| %>
   <%= f.fields_for 'photos[0]' do |attachments| %>
     <%= attachments.file_field :image %>
   <% end %>
 <% end %>

Это дает желаемый формат. Вы можете увеличить индекс с помощью javascript, если заранее не знаете, сколько изображений будет загружено.

Тогда вы можете просто иметь в себе контроллер:

@world = World.new(params[:world])

Но не забудьте эту строку в вашей модели:

embeds_many :photos, cascade_callbacks: true

согласно этой проблеме.

Также избыточно иметь accepts_nested_attributes_for для встроенного документа, так как это значение по умолчанию.

0 голосов
/ 13 октября 2011

10.times {@world.photos.build} в вашем контроллере World, и вы получите 10 полей ввода с правильными именами, спасибо Radar @ irc.freenode.net #RubyOnRails

...