簡體   English   中英

Rails控制器不接受JSON嗎?

[英]Rails controller does not accept JSON?

我正在嘗試通過JSON請求創建ActiveRecord對象。 但是,控制器無法在新創建的對象中設置在參數中傳遞的變量。 例如,人員對象具有兩個字段:名字和姓氏。

由JSON.org庫的JSON.stringify函數生成的JSON產生:

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

但是,控制器希望JSON采用以下形式:

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

我知道在正常的事件過程中(對於HTTP請求),請求的參數嵌套在正在創建的模型的類名下。

控制器中的create動作是:

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,亞當

如果您只是傳遞所有人員參數的哈希值(而不是傳遞以“ person”作為鍵的嵌套哈希值),則您應該能夠執行@person = Person.new(params)

至於ActiveRecord 3.0.7,您只需添加

self.include_root_in_json = false

到您的模型(person.rb)以擺脫根({“ Person”:“)部分的影響。

允許使用諸如{“ firstname”:“ Joe”,“ lastname”:“ Bloggs”}之類的平面JSON輸入以及通過HTML表單獲得的嵌套類型的一個想法是:

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

respond_to do |format|
  ..
end

另外, Person.new(params.reject{|k,v| k != "firstname" || k != "lastname"})可以在您的Ruby中使用。

...

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

這是一個更具前瞻性的解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM