Отправка файлов в Rails JSON API

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

has_attached_file :image

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

Другим решением является отправка запроса multipart/form-data, очень похожего на тот , который описывает здесь LEEjava. Проблема с этим заключается в том, что параметры запроса неправильно интерпретируются в Rails 3.2.2, и JSON.parse выдает ошибку при попытке проанализировать параметры, или, возможно, Rails что-то неправильно интерпретирует.

Начат POST "/api/v1/somemodel.json?token=ZoipX7yhcGfrWauoGyog" для 127.0.0.1 в 18-03-2012 15:53:30 +0200 Обработка с помощью Api::V1::SomeController#create as JSON Параметры: {"{\n
\"parentmodel\": {\n \"superparent_id\": 1,\n
\"description\": \"Наслаждайтесь цветком\",\n \"\": "=>{"\n
{\n \"некоторый атрибут\": 1,\n
\"someotherattribute\": 2,\n \"image\": \"image1\"\n
}\n "=>{"\n }\n}"=>nil}}, "token"=>"ZoipX7yhcGfrWauoGyog"}

Это довольно сложно читать, извините. JSON.parse(params[:parentmodel]) здесь невозможен, и я не могу JSON.parse(params) либо из-за атрибута токена, JSON.parse(params) выдает эту ошибку:

TypeError (не могу преобразовать ActiveSupport::HashWithIn DifferentAccess в String)

Это наводит меня на мысль, что я либо совершенно неправильно подхожу к этой проблеме, либо просто что-то делаю. В любом случае, мы можем быть уверены, что я в чем-то ошибаюсь. :)

Есть ли лучший способ сделать это? Может ли кто-нибудь указать мне на какое-либо руководство/учебник или написать ответ, описывающий, как мне следует подходить к этому?

Заранее спасибо

ОБНОВЛЕНИЕ: Так что теперь у меня все работает, но только в тестах. Я не совсем уверен, как это работает, но, возможно, кто-то может заполнить пробелы для меня? Это часть тестового кода (изображение: fixment_file_upload(...) является важной частью).

parts_of_the_object = { someattribute: 0, someotherattribute: 0, image: fixture_file_upload('/images/plot.jpg', 'image/jpg') }

Мои params[] выглядят так, как будто была отправлена ​​обычная HTML-форма, что странно (и круто):

Parameters: {"superparentid"=>"1", "plots"=>[{"someattribute"=>"0", "someotherattribute"=>"0", "image"=>#>}], "token"=>"4L5LszuXQMY6rExfifio"}

Запрос сделан так же, как и запрос на отправку сделан с помощью rspec:

post "/api/v1/mycontroller.json?token=#{@token}", thefull_object

Итак, я понял все работает. Я просто не знаю, как именно это работает! Я хочу иметь возможность создать такой ответ и сам, а не только из RSpec. :-)

29
задан Emil Ahlbäck 18 March 2012 в 18:52
поделиться