2009-01-05 70 views
8

我想通過JSON請求創建一個ActiveRecord對象。但是,控制器無法設置在新創建的對象中傳遞給參數的變量。舉個例子,一個person對象有兩個字段:firstname和lastname。由JSON.org庫的JSON.stringify函數生成Rails控制器不接受JSON?

的JSON生產:

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

然而控制器期望的JSON是在形式:

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

我知道在正常情況下(對於HTTP請求),請求的參數 嵌套在正在創建的模型 的類名下。

控制器中的創建操作是:

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 

如產生什麼將是控制器來處理JSON 要求最巧妙的方法?或者,您是如何從Javascript對象生成「正確的」 JSON以傳遞給您的控制器?

TIA, 亞當

回答

4

如果你只是過客所有的人蔘數(而不是嵌套哈希以「人」爲重點)的散列,那麼你就應該能夠做到@person = Person.new(params)

+0

這仍然適用於標準的HTML請求,或者我應該重構JSON請求到一個單獨的方法? – apchester 2009-01-05 22:31:11

+0

不需要。您應該重寫您的JSON請求以傳遞通過HTML傳遞的相同類型的參數。 – 2009-01-06 04:46:24

0

或者,Person.new(params.reject{|k,v| k != "firstname" || k != "lastname"})會在您的Ruby中執行。

...

Person.new({:firstname => params[:firstname], :lastname => params[:lastname]}) - 這實際工作

這裏有一個更面向未來的解決方案:

允許扁平JSON輸入諸如{ 「名字」
Person.new(params.reject{|k,v| not Person.column_names.include?(k) }) 
0

一個想法: 「Joe」,「lastname」:「Bloggs」}以及用HTML表單獲得的嵌套類型爲:

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

respond_to do |format| 
    .. 
end 
1

至於ActiveRecord的3.0.7,您可以只添加

self.include_root_in_json = false 

到模型(person.rb)擺脫從根({ 「人」:「)的一部分。