2009-09-17 115 views
0

我有一个名为Book的模型,has_many:photos(通过回形针处理的文件附件)。通过JSON API通过HTTP发布文件附件

我目前正在构建一个客户端,它将使用Paul Dix的Typhoeus gem(它使用libcurl)通过JSON与我的Rails应用程序进行通信。

发布新的Book对象很容易。要创建具有标题一本新书记录“你好”,我可以做这样简单的东西:

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

class Remote 
    include Typhoeus 
end 

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

我的问题,当我试图将照片添加到该查询开始。只需通过HTML表单提交的文件附件创建一个这样的查询:

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

所以我的假设是我期待重新创建Remote.post调用相同的查询。

我在想,我让散列内的散列数组的语法得到我最好的。我一直在试图做什么,我期待会的工作,这将是类似的变化:

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

但这似乎连接成一个字符串我想要制作成散列,并返回(不管我在做:图像=>“”散列):

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

但我也不想浪费太多时间搞清楚什么是错在这里我的语法,如果这不是无论如何要去上班,所以我想我会来这里。

我的问题是: 我在正确的轨道上吗?如果我清除此语法来发布散列数组而不是奇怪的连接字符串,是否应该足以将图像传递到Book对象?

还是我接近这个错误?

回答

1

其实,你不能在xhr上发布文件,在javascript中有一个安全预防措施,以防止它处理任何文件。解决此问题的技巧是将文件发布到隐藏的iframe,并且iframe会定期发布到服务器,从而避免整个页面刷新。该技术是在几个地方详述,可能尝试这一个(他们使用PHP,但原理是一样的,并没有经过长时间的讨论是有益的):

Posting files to a hidden iframe

+0

这是一个非常有趣的观点,但是这个客户端不是基于浏览器的应用程序,因此不幸的是,iframe是不可能的。 – btw 2009-09-18 01:38:15