Rails控制器不接受JSON?

时间:2009-01-05 21:32:52

标签: javascript ruby-on-rails json

我正在尝试通过JSON请求创建ActiveRecord对象。但是,控制器无法设置新创建的对象中的参数中传递的变量。例如,person对象有两个字段:firstname和lastname。

JSON.org库的JSON.stringify函数生成的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 个答案:

答案 0 :(得分:4)

如果您只是传递所有人参数的哈希值(而不是以“人”作为键的嵌套哈希),那么您应该能够@person = Person.new(params)

答案 1 :(得分:1)

对于ActiveRecord 3.0.7,您只需添加

即可
self.include_root_in_json = false

到您的模型(person.rb)摆脱root({“Person”:“)part。

答案 2 :(得分:0)

  

或者,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) })

答案 3 :(得分:0)

允许使用平面JSON输入的一个想法,例如{“firstname”:“Joe”,“lastname”:“Bloggs”}以及使用HTML表单获得的嵌套类型将是:

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

respond_to do |format|
  ..
end