2011-05-05 2 views
0

Je crée une application de blog de base avec des rails/back-end MongoId et un client iOS qui a un modèle de messages avec le nom et l'image. Je reçois l'erreur suivante lorsque je crée un nouveau pos à partir d'une application iOS.BSON :: InvalidDocument lors de l'insertion dans MongoDB d'iOS client

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' 

Du côté iOS J'utilise ASIHttpRequest avec le code suivant:

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]; 

Le journal du serveur montre:

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) 

Répondre

1

Le message d'erreur indique que ne peut pas être la classe suivante sérialisé en BSON: ActionDispatch::Http::UploadedFile.

Sur la base de votre message dans les journaux de serveur, vous expédiez un objet JSON avec un champ « image » hors du commun. Je soupçonne que le problème est ici.

On dirait que vos fichiers sont stockés dans un emplacement temporaire sur le disque. Essayez-vous de sauvegarder les octets réels du fichier ou juste cet emplacement temporaire? Utilisez-vous GridFs ici?

Pouvez-vous confirmer que la classe peut en effet être sérialisé à BSON? Est-ce que la sérialisation fait la bonne chose?

+0

Il faut sauver la image réelle dans le dossier des images de mon application rails. Je ne stocke pas l'image dans Mongo, juste l'adresse de l'image. Je soumets fondamentalement un pour créer un nouveau message suivant les instructions pour ASIFormDataRequest – John

+0

Je recevais ce problème par une faute de frappe dans mon nom d'entrée de formulaire "imamge" au lieu de "image". TTT ... TTT. –

0

L'erreur est tout à fait évidente, et à moins que vous souhaitez utiliser paperclip ou toute autre solution, vous aurez à faire vous-même.

Par exemple, si vous happend d'avoir un champ: blob et champ: nom de fichier dans votre modèle, puis pour vous sauver aurez besoin d'avoir quelque chose comme ceci dans votre modèle:


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