Die Schienen-Controller akzeptiert keine JSON?
-
03-07-2019 - |
Frage
Ich versuche, ein Active Objekt über eine JSON Anfrage zu erstellen. Allerdings versagt die Steuerung die Variablen in den Parametern in dem neu erstellten Objekt übergeben zu setzen. Als Beispiel hat eine Person Objekt zwei Felder:. Vornamen und Nachnamen
Die JSON durch die JSON.stringify Funktion der JSON.org Bibliothek erzeugt erzeugt:
{"firstname" : "Joe" , "lastname" : "Bloggs"}
Allerdings ist die Steuerung der JSON erwartet in Form zu sein:
{ "Person" : {"firstname" : "Joe" , "lastname" : "Bloggs"} }
Ich bin mir bewusst, dass im normalen Verlauf der Ereignisse (für HTTP-Anfragen) die Parameter für die Anforderung unter dem Klassennamen des Modells verschachtelt erschaffen werden.
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 die sauberste Art und Weise für die Steuerung wäre, die JSON zu verarbeiten fordert wie erzeugt? Oder alternativ, wie generieren Sie „richtigen“ JSON von Javascript-Objekte zu Ihrem Controller vorbei?
TIA, Adam
Lösung
Wenn Sie nur einen Hash aller der Person Parameter übergeben (statt einem verschachtelten-Hash mit „Person“ als Schlüssel), dann sollten Sie nur in der Lage sein @person = Person.new(params)
zu tun.
Andere Tipps
Wie bei Active 3.0.7, können Sie einfach hinzufügen
self.include_root_in_json = false
zu Ihrem Modell (person.rb) vom Stamm zu befreien ({ "Person": "). Teil
Alternativ
Person.new(params.reject{|k,v| k != "firstname" || k != "lastname"})
würde in Ruby tun....
Person.new({:firstname => params[:firstname], :lastname => params[:lastname]})
- dies tatsächlich funktioniert
Hier ist eine weitere zukunfts Lösung:
Person.new(params.reject{|k,v| not Person.column_names.include?(k) })
Eine Idee für das Erlauben flach JSON Eingang wie { „Vorname“: „Joe“, „Nachname“: „Bloggs“} und die verschachtelte Art, die Sie mit einem HTML-Formular erhalten wäre:
@person = Person.new(params[:person] || params)
respond_to do |format|
..
end