我正在尝试通过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, 亚当
答案 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