Javascript Rails控制器不接受JSON?

Javascript Rails控制器不接受JSON?,javascript,ruby-on-rails,json,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"}

我试图通过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

蒂亚,
Adam

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

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

允许平面JSON输入,如{“firstname”:“Joe”,“lastname”:“Bloggs”}和HTML表单中的嵌套类型的一个想法是:

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

respond_to do |format|
  ..
end

对于ActiveRecord 3.0.7,您只需添加

self.include_root_in_json = false

到您的模型(person.rb)以从根目录中删除({“person”:)部分。

这是否仍然适用于标准HTML请求,还是我应该将JSON请求重构为一个单独的方法?不。你应该真正重写JSON请求,以传递通过HTML传递的相同类型的参数。谢谢Zach,我也这么想,但想确定最佳实践。干杯,AdamWhich要求你您正确设置了“受保护”属性,因此有人无法传入:isAdmin=>true。