2009-01-05 12 views
8

Próbuję utworzyć obiekt ActiveRecord za pomocą żądania JSON. Jednak kontroler nie ustawi zmiennych przekazanych w parametrach w nowo utworzonym obiekcie. Przykładowo obiekt osoby ma dwa pola: imię i nazwisko.Kontroler Railsów nie akceptuje JSON?

JSON generowane przez funkcję JSON.stringify biblioteki json.org produkuje:

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

Jednak kontroler oczekuje JSON być w formie:

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

jestem świadomy że w normalnym toku zdarzeń (dla żądań HTTP) parametry dla żądania są zagnieżdżone pod nazwą klasy tworzonego modelu .

Akcja tworzyć w sterowniku jest:

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 

Jaki byłby neatest sposobem dla kontrolera do przetwarzania żądań jako JSON generowane? Lub alternatywnie w jaki sposób generujesz "poprawny" JSON z obiektów JavaScript do przekazania do kontrolerów?

TIA, Adam

Odpowiedz

4

Jeśli tylko przejazdem hash wszystkich parametrów osobę (zamiast zagnieżdżonego-hash z „osoby” jako klucz), a następnie należy po prostu być w stanie zrobić @person = Person.new(params).

+0

Czy to nadal działa w przypadku standardowych żądań HTML, czy też powinienem przekształcić żądania JSON w osobną metodę? – apchester

+0

Nie. Naprawdę powinieneś przepisać swoje żądania JSON, aby przekazać te same parametry, które byłyby przekazywane za pomocą HTML. –

+0

Dzięki Zach, Myślałem tak samo, ale chciałem mieć pewność co do najlepszej praktyki. Pozdrowienia, Adam – apchester

0

Alternatywnie, Person.new(params.reject{|k,v| k != "firstname" || k != "lastname"}) zrobi w twoim Ruby.

...

Person.new({:firstname => params[:firstname], :lastname => params[:lastname]}) - to faktycznie działa

Oto bardziej przyszłościowe rozwiązanie:

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

Który wymaga poprawnej konfiguracji atrybutów "chronionych", aby ktoś nie mógł przekazać: isAdmin => true. –

0

Jeden pomysł pozwalając płaskiej wejście JSON takich jak { "FirstName": "Joe", "lastname": "Bloggs"} i rodzaj zagnieżdżenia otrzymany w formularzu HTML to:

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

respond_to do |format| 
    .. 
end 
1

chodzi o ActiveRecord 3.0.7, można po prostu dodać

self.include_root_in_json = false 

do danego modelu (person.rb), aby pozbyć się z korzenia ({ "Osoba": ") część.

Powiązane problemy