0

我有一个名为 Book 的模型,它有_many :photos(由回形针处理的文件附件)。

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

发布一个新的 Book 对象很容易。要创建标题为“Hello There”的新图书记录,我可以执行以下简单操作:

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

但这似乎将我想要制作的哈希连接成一个字符串,然后返回(无论我在 :image => "" 哈希中做什么):

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

但是我也不想浪费太多时间来弄清楚我的语法有什么问题,如果这无论如何都行不通,所以我想我会来这里。

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

还是我接近这个错误?

4

1 回答 1

1

实际上,您不能通过 xhr 发布文件,javascript 中有一个安全预防措施可以防止它处理任何文件。解决这个问题的诀窍是将文件发布到隐藏的 iframe,并且 iframe 会定期发布到服务器,避免整个页面刷新。该技术在几个地方进行了详细介绍,可能尝试一下(他们使用的是 php,但原理保持不变,并且有一个冗长的讨论很有帮助):

将文件发布到隐藏的 iframe

于 2009-09-17T23:41:31.573 回答