Размещение файловых вложений через HTTP через JSON API - PullRequest
0 голосов
/ 17 сентября 2009

У меня есть модель под названием Book, которая has_many: фотографии (прикрепленные файлы обрабатываются скрепкой).

В настоящее время я создаю клиент, который будет взаимодействовать с моим приложением Rails через JSON, используя гем Typhoeus Пола Дикса, который использует libcurl.

Размещать новый объект 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" }] }}})

Но, похоже, это объединяет в строку то, что я пытаюсь превратить в хеш, и возвращает (независимо от того, что я делаю в хеше: image => ""):

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

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

Мой вопрос: Я на правильном пути? Если я проясню этот синтаксис для публикации массива хэшей вместо странно сцепленной строки, этого будет достаточно для передачи изображений в объект Book?

Или я подхожу к этому неправильно?

1 Ответ

1 голос
/ 18 сентября 2009

На самом деле, вы не можете публиковать файлы через xhr, в javascript есть мера безопасности, которая вообще не позволяет обрабатывать файлы. Хитрость заключается в том, чтобы отправить файл на скрытый iframe, а iframe регулярно отправляет сообщение на сервер, избегая полного обновления страницы. Техника подробно описана в нескольких местах, возможно, попробуйте этот (они используют php, но принцип остается тем же, и есть длительное обсуждение, которое полезно):

Отправка файлов на скрытый iframe

...