2009-01-05 11 views
8

Ich versuche, ein ActiveRecord-Objekt über eine JSON-Anfrage zu erstellen. Der Controller kann jedoch die in den Parametern des neu erstellten Objekts übergebenen Variablen nicht setzen. Als ein Beispiel hat ein Personenobjekt zwei Felder: Vorname und Nachname.Rails Controller akzeptiert JSON nicht?

Die JSON durch die JSON.stringify Funktion der JSON.org Bibliothek erzeugt produziert:

{"firstname" : "Joe" , "lastname" : "Bloggs"} 

jedoch die Steuerung der JSON erwartet in Form zu sein:

{ "Person" : {"firstname" : "Joe" , "lastname" : "Bloggs"} } 

Ich bin mir bewusst, dass im normalen Ablauf der Ereignisse (für HTTP-Anforderungen) die Parameter für die Anforderung unter dem Klassennamen des Modells verschachtelt werden, das erstellt wird.

Die erstellen Aktion im Controller ist:

def create 
    @person = Person.new(params[:person]) 

    respond_to do |format| 
     if @person.save 
     flash[:notice] = 'Person was successfully created.' 
     format.html { redirect_to(@person) } 
     format.xml { render :xml => @person, :status => :created, :location => @person } 
     format.json { render :json => @person, :status => :created, :location => @person } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @person.errors, :status => :unprocessable_entity } 
     format.json { render :json => @person.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

Was wäre die sauberste Art und Weise für die Steuerung sein, die JSON Anfragen als erzeugt zu verarbeiten? Oder alternativ, wie generieren Sie " JSON von Javascript-Objekten" korrekt für die Weitergabe an Ihre Controller?

TIA, Adam

Antwort

4

Wenn Sie nur einen Hash aller der Person Parameter (statt einer verschachtelten-Hash mit „Person“ als Schlüssel) vorbei, dann sollten Sie nur in der Lage sein @person = Person.new(params) zu tun.

+0

Würde dies immer noch für Standard-HTML-Anfragen funktionieren oder sollte ich die JSON-Anfragen in eine separate Methode umgestalten? – apchester

+0

Nein. Sie sollten Ihre JSON-Anforderungen wirklich neu schreiben, um die gleichen Parameter zu übergeben, die über HTML übergeben werden. –

+0

Danke Zach, Ich dachte so viel, aber wollte über Best Practice sicher sein. Cheers, Adam – apchester

0

Alternativ Person.new(params.reject{|k,v| k != "firstname" || k != "lastname"}) würde in Ihrem Ruby tun.

...

Person.new({:firstname => params[:firstname], :lastname => params[:lastname]}) - das funktioniert tatsächlich

Hier ist eine zukunftssichere Lösung:

Person.new(params.reject{|k,v| not Person.column_names.include?(k) }) 
+0

Das erfordert, dass Sie Ihre "geschützten" Attribute richtig einrichten, so dass jemand nicht übergeben kann: isAdmin => True. –

0

Eine Idee für das Erlauben flach JSON Eingang wie { "Vorname": "Joe", "Nachname": "Bloggs"} und die verschachtelte Art, die Sie mit einem HTML-Formular bekommen, wären:

@person = Person.new(params[:person] || params) 

respond_to do |format| 
    .. 
end 
1

Wie für Active 3.0.7, können Sie einfach

self.include_root_in_json = false 

zu Ihrem Modell (person.rb) hinzufügen, von der Wurzel loszuwerden ({ "Person": ") teil.

Verwandte Themen