2012-05-23 10 views
5

Ich habe seit einer Weile, und bin derzeit ratlos. Ich habe das Problem darauf beschränkt, mit JSON verwandt zu sein, und das JSON scheint nicht in einem lesbaren Format gesendet zu werden.Rails 3.2 - ActiveResource - Verwenden von POST/PUT mit JSON

Wir haben zuvor Rails 3.0.7 verwendet (wobei das Problem, das ich beschreiben möchte, NICHT existierte). Wir müssen Rails aktualisieren, um einige neue Funktionen zu nutzen - aber jetzt gibt es dieses Problem. Ich bin mir fast sicher, dass es zu diesem Zeitpunkt eine einfache Konfiguration oder etwas ist, aber ich brauche noch ein paar Augen darauf.

Wir verwenden ActiveResource-Objekte, und beim Festlegen der Werte des Objekts und Speichern (und damit ein PUT), erhalten wir ab 403: Verboten zurückgegeben vom Remote-Web-Service. Dies ist kein Problem auf der Web-Service-Schicht.

Beim Erstellen eines neuen Objekts und Erstellen eines POST erhalten wir 409: Konflikt zurückgegeben, wie es versucht, die Datenbank mit Standardwerten zu aktualisieren - was bedeutet, dass die Json-Daten den Dienst nicht erreicht - oder nicht lesbar ist.

Mein Problem ist, dass dies in Rails 3.0.7 funktionierte, und nicht mehr in 3.2.3 funktioniert (oder 3.1.3, die ich auch ausprobiert habe). Ich bin offen für andere Vorschläge als die JSON-Daten, aber ich bin mir ziemlich sicher, dass dies das Problem ist.

Mein Active Modell hat

self.format = :json 

Ich habe nach dem in einem meiner initializer Dateien:

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

Dank für Ihre Anregungen!

UPDATE

Ich habe mit curl testet worden und habe es durch die Arbeit:

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 

Ich habe die Arbeit, aber

  1. er den Inhalt erscheint -Type-Header muss explizit festgelegt werden, andernfalls führt es zu einem 415: Media Unrecognized Fehler

  2. Wenn ich den Content-Type-Header im ActiveResource-Objekt festlegen, bekomme ich immer noch den 409: Conflict-Fehler - was zu der Annahme führt, dass der JSON immer noch nicht richtig gebildet ist.

EDIT (Wieder)

Ich habe herausgefunden, wo das Problem mit dem JSON ist - Rails die Wurzel in der JSON hält. So anstelle der Ressource zurück, als

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

Es sendet

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

Aber ich include_root_in_json auf false gesetzt haben - habe ich versucht, dies sowohl in den Initialisierer-Dateien und direkt in das Modell selbst und keine Veränderung.

+2

Also ich dies die 'to_json' Methode in meinem Modell durch zwingende„fixed“einfach zurückgeben' self.attributes.to_json' - Wenn jedoch jemand Ideen hat, warum die 'include_root_in_json'-Konfiguration nicht funktioniert, bin ich immer noch sehr neugierig, da ich finde, dass Konfiguration eine elegantere Lösung wäre. Vielen Dank! – Krista

+0

Vielleicht möchten Sie die Lösung als Antwort hinzufügen und akzeptieren Sie sie ... – Smar

+0

Vielen Dank! Gute Idee – Krista

Antwort

1

Also ich „fixiert“ diese (um es funktionierte), indem die to_json Methode in meinem Modell überschreiben einfach 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

Sieht aus wie Active :: Base.include_root_in_json in Rails zurückzukehren gebrochen 3-2- stabil (einschließlich 3.2.13). Dieses Problem wurde in dem Standalone-Active Repo festgelegt:

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

Sie Affen es in einem Ihrem initializers durch das gleiche tun flicken können.

aktualisieren: Dieses Problem wird in Schienen fixiert wurde 3-2 stabile backport commit

+0

3-2-stable hat diese Patch-Pull-Anfrage zusammengeführt. Die nächste Version 3.2.14 enthält diesen Fix. – Dingle