BSON :: InvalidDocument при вставке в MongoDB из iOS-клиента - PullRequest
0 голосов
/ 06 мая 2011

Я создаю базовое приложение для блога с рельсами / mongoid и клиентом iOS, в котором есть модель постов с именем и изображением.Я получаю следующую ошибку при создании новой позиции из приложения iOS.

  BSON::InvalidDocument 
(Cannot serialize an object of class ActionDispatch::Http::UploadedFile into BSON.):
      app/controllers/posts_controller.rb:47:in `create'
      app/controllers/posts_controller.rb:46:in `create'

На стороне iOS я использую ASIHttpRequest со следующим кодом:

 NSURL *url=[[NSURL alloc] initWithString:@"http://localhost:3000/posts"];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    [request setPostValue:@"Ben" forKey:@"[post] name"];
    [request setFile:@"/Users/Seb/Desktop/beach.jpeg" forKey:@"[post] image"]; 
    [request startSynchronous];  

Журнал сервера показывает:

Started POST "/posts" for 127.0.0.1 at Thu May 05 14:37:10 -0700 2011
  Processing by PostsController#create as HTML
  Parameters: {"post"=>{" name"=>"Ben", " image"=>#<ActionDispatch::Http::UploadedFile:0x103e48fc8 @content_type="image/jpeg", @original_filename="beach.jpeg", @headers="Content-Disposition: form-data; name=\"[post] image\"; filename=\"beach.jpeg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/var/folders/PI/PI+kcHrCHfuDh-K+ppxAxE+++TI/-Tmp-/RackMultipart20110505-11613-x75qie-0>>}}
Completed   in 21ms

BSON::InvalidDocument (Cannot serialize an object of class ActionDispatch::Http::UploadedFile into BSON.):
  app/controllers/posts_controller.rb:47:in `create'
  app/controllers/posts_controller.rb:46:in `create'

Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.6/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.3ms)
Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.6/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (9.5ms)

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Сообщение об ошибке указывает, что следующий класс не может быть сериализован в BSON: ActionDispatch::Http::UploadedFile.

Исходя из вашего сообщения в журналах сервера, вы отправляете объект JSON с необычным «изображением»поле.Я подозреваю, что проблема заключается здесь.

Похоже, ваши файлы хранятся во временной папке на диске.Вы пытаетесь сохранить фактические байты файла или только это временное местоположение?Вы используете GridFs здесь?

Можете ли вы подтвердить, что класс действительно можно сериализовать в BSON?Эта сериализация делает правильные вещи?

0 голосов
/ 08 мая 2011

Ошибка совершенно очевидна, и если вы не хотите использовать скрепку или другое решение, вам придется сделать это самостоятельно.

Например, если в вашей модели есть поле: blob и field: filename, для сохранения вам понадобится что-то подобное в вашей модели:


class Post
...
  def image=(img)
    self.filename = img.original_filename
    self.blob = img.read
  end
end
...