2012-05-23 12 views
5

Patrzyłem na to od dłuższego czasu, a obecnie jestem w rozsypce. Zwiodłem problem do powiązania z JSON i że JSON nie wydaje się być wysyłany w czytelnym formacie.Rails 3.2 - ActiveResource - Używanie POST/PUT z JSON

Wcześniej używaliśmy Railsów 3.0.7 (gdzie problem, który mam zamiar opisać, NIE istniał). Musimy uaktualnić Railsy, ​​aby skorzystać z niektórych nowych funkcji - ale teraz jest ten problem. W tej chwili jestem niemal pewien, że jest to prosta konfiguracja lub coś takiego, ale potrzebuję więcej na to spojrzeć.

Korzystamy z obiektów ActiveResource, a po ustawieniu wartości obiektu i zapisaniu go (w ten sposób dokonując PUT) otrzymujemy ab 403: Zabroniony powrót ze zdalnej usługi WWW. To nie jest problem w warstwie serwisowej.

Po utworzeniu nowego obiektu i zrobieniu POST, otrzymujemy 409: Konflikt zwracany podczas próby aktualizacji bazy danych z wartościami domyślnymi - co oznacza, że ​​dane json nie docierają do usługi - lub nie są czytelne.

Moim problemem jest to, że działało to w Railsach 3.0.7 i już nie działa w wersji 3.2.3 (lub wersji 3.1.3, którą również wypróbowałem). Jestem otwarty na sugestie inne niż dane JSON, ale jestem pewien, że właśnie tam jest problem.

Mój model ActiveResource ma

self.format = :json 

Mam następujący w jednej z moich plików initializer:

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

Dzięki za wszelkie sugestie!

UPDATE

I zostały testowanie z dyni i dostałem go do pracy przez:

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 

mam, że do pracy, ale

  1. Wydaje Zawartości -Type nagłówek musi być jawnie ustawiony inaczej spowoduje to błąd 415: Media Unrecognized

  2. Jeśli ustawię nagłówek Content-Type w obiekcie ActiveResource, nadal pojawia się błąd 409: Conflict - który prowadzi mnie do przekonania, że ​​JSON nadal nie jest prawidłowo uformowany.

EDIT (ponownie)

I wzorzysty, gdzie problem z JSON - szynach utrzymywania korzeni w JSON. Zatem zamiast wysyłać zasób powrotem jako

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

To jest wysyłanie

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

Jednak mam ustawione include_root_in_json false - Próbowałem to zarówno w plikach inicjująca i bezpośrednio w samym modelu i bez zmian.

+2

Więc „stałe” to poprzez nadpisanie metody 'to_json' w moim modelu po prostu wrócić' self.attributes.to_json' - jeśli jednak ktoś ma pomysły, dlaczego konfiguracja "include_root_in_json" nie działa, nadal jestem bardzo ciekawy, ponieważ uważam, że taka konfiguracja byłaby bardziej eleganckim rozwiązaniem. Dzięki! – Krista

+0

Możesz dodać rozwiązanie jako odpowiedź i zaakceptować je ... – Smar

+0

Dzięki! Dobry pomysł – Krista

Odpowiedz

1

Więc „stałe” to (pracował wokół niego) poprzez nadpisanie metody to_json w moim modelu po prostu wrócić self.attributes.to_json

class Document < ActiveResource::Base 
    self.site += 'user/:user_id' 
    self.element_name = "docs" 

    def to_json(options={}) 
    self.attributes.to_json(options) 
    end 
end 
1

Wygląda ActiveResource :: Base.include_root_in_json jest uszkodzony w Rails 3-2- stabilny (w tym 3.2.13). Ten problem został rozwiązany w jednostkowym activeresource repo:

def to_json(options={}) 
    super(include_root_in_json ? { :root => self.class.element_name }.merge(options) : options) 
end 

Można małpa załatać go w jednym ze swoich inicjalizatorów robiąc to samo.

Aktualizacja: Ten problem został rozwiązany w szynach 3-2-stabilnych backport commit

+0

3-2-stable połączyło to żądanie aktualizacji patcha. Następna wersja 3.2.14 będzie zawierała tę poprawkę. – Dingle

Powiązane problemy