Rails 3.2 - ActiveResource - Использование POST/PUT с JSON

Я некоторое время смотрел на это и в настоящее время в недоумении. Я сузил проблему до того, что она связана с JSON, и что JSON, похоже, не отправляется в разборчивом формате.

Ранее мы использовали Rails 3.0.7 (где проблема, которую я собираюсь описать, НЕ существовала). Нам нужно обновить Rails, чтобы воспользоваться некоторыми новыми функциями, но теперь возникла эта проблема. Я почти уверен, что на данный момент это простая конфигурация или что-то в этом роде, но мне нужно больше внимания на нее.

Мы используем объекты ActiveResource, и после установки значений объекта и его сохранения (таким образом, выполняя PUT) мы получаем ab 403: Forbidden, возвращаемый удаленной веб-службой. Это не проблема на уровне веб-сервиса.

После создания нового объекта и выполнения POST мы получаем 409:Конфликт, возвращаемый при попытке обновить базу данных значениями по умолчанию, что означает, что данные json не достигают службы или неразборчивы.

Моя проблема в том, что это работало в Rails 3.0.7 и больше не работает в 3.2.3 (или 3.1.3, которую я тоже пробовал). Я открыт для предложений, отличных от данных JSON, однако я уверен, что проблема именно в этом.

Моя модель ActiveResource имеет

self.format = :json

В одном из моих файлов инициализатора есть следующее:

ActiveResource::Base.include_root_in_json = false
ActiveSupport::JSON.backend = "json_gem" 

Спасибо за любые предложения!

ОБНОВЛЕНИЕ

Я тестировал curl и заставил его работать следующим образом:

curl -H "Content-Type: application/json" -d "{\"userID\":\"xxx\", \"label\":\"doc.test.test\", \"value\":\"1,19\", \"id\":\"-1\"}" -v -X POST http://host:port/usermanagement/users/xxx/prefs

Я заставил это работать, но

  1. Похоже, что заголовок Content-Type должен быть явно установлен, иначе это приведет к 415:Media Unrecognized error

  2. Если я устанавливаю заголовок Content-Type в объекте ActiveResource, я все равно получаю ошибку 409:Conflict, что заставляет меня полагать, что JSON все еще неправильно сформирован.

РЕДАКТИРОВАТЬ (снова)

Я понял, в чем проблема с JSON - Rails сохраняет корень в JSON. Таким образом, вместо того, чтобы отправлять ресурс обратно как

{"name":"value", "name":"value"}

, он отправляет

{"ResourceName": {"name":"value", "name":"value"}}

. Однако я установил include_root_in_jsonв false — я пробовал это и в файлах инициализатора, и непосредственно в самой модели, и нет. изменять.

6
задан Krista 24 May 2012 в 15:50
поделиться