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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top