2009-09-17 9 views
0

J'ai un modèle appelé Book, qui a beaucoup de photos (pièces jointes gérées par paperclip).POSTing des pièces jointes via HTTP via l'API JSON

Je suis actuellement en train de construire un client qui communiquera avec mon application Rails via JSON, en utilisant le gem Typhoeus de Paul Dix, qui utilise libcurl.

POSTing un nouvel objet Book était assez facile. Pour créer un nouveau record du livre avec le titre « Bonjour » Je pouvais faire quelque chose d'aussi simple que cela:

require 'rubygems' 
require 'json' 
require 'typhoeus' 

class Remote 
    include Typhoeus 
end 

p Remote.post("http://localhost:3000/books.json", 
    { :params => 
    { :book => { :title => "Hello There" }}}) 

Mes problèmes commencent lorsque je tente d'ajouter les photos à cette requête. POSTer simplement les pièces jointes via le formulaire HTML crée une requête comme ceci:

Parameters: {"commit"=>"Submit", "action"=>"create", "controller"=>"books", "book"=>{"title"=>"Hello There", "photo_attributes"=>[{"image"=>#<File:/var/folders/1V/1V8Kw+LEHUCKonqJ-dp3oE+++TI/-Tmp-/RackMultipart20090917-3026-i6d6b9-0>}]}} 

Et donc mon hypothèse est que je suis à la recherche de recréer la même requête dans l'appel Remote.post.

Je pense que je laisse la syntaxe de la table de hachage dans un hachage obtenir le meilleur de moi. Je suis tenté de faire des variations de ce que j'attendais fonctionnerait, ce qui serait quelque chose comme:

p Remote.post("http://localhost:3000/books.json", 
    { :params => 
    { :book => { :title => "Hello There", 
       :photo_attributes => [{ :image => "/path/to/image/here" }] }}}) 

Mais cela semble concaténer dans une chaîne ce que je suis en train de faire dans un hachage, et retourne (peu importe ce que je fais dans: image => « » hachage):

NoMethodError (undefined method `stringify_keys!' for "image/path/to/image/here":String): 

Mais je ne veux pas aussi perdre trop de temps à trouver ce qui ne va pas avec ma syntaxe ici si ce n'est pas aller au travail de toute façon, alors je me suis dit que je viendrais ici.

Ma question est: Suis-je sur la bonne voie? Si je supprime cette syntaxe pour publier un tableau de hachages à la place d'une chaîne étrangement concaténée, cela devrait-il suffire à transmettre les images dans l'objet Book?

Ou est-ce que j'approche ce problème?

Répondre

1

En fait, vous ne pouvez pas poster des fichiers sur xhr, il y a une précaution de sécurité en javascript qui empêche la gestion des fichiers du tout. L'astuce consiste à poster le fichier sur un iframe caché, et l'iframe fait un post régulier sur le serveur, en évitant l'actualisation complète de la page. La technique est détaillée dans plusieurs endroits, essayez peut-être celui-ci (ils utilisent php, mais le principe reste le même, et il y a une longue discussion qui est utile):

Posting files to a hidden iframe

+0

Ce point est très intéressant , cependant ce client n'est pas une application basée sur un navigateur, donc un iframe est malheureusement hors de question. – btw

Questions connexes