Rails控制器不接受JSON?
-
03-07-2019 - |
题
我正在尝试通过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, 亚当
解决方案
如果你只是传递所有人参数的哈希值(而不是带有“person”的嵌套哈希值作为键)那么你应该只能做 @person = Person.new( PARAMS)代码>
其他提示
对于ActiveRecord 3.0.7,您只需添加
即可self.include_root_in_json = false
到您的模型(person.rb)摆脱root({" Person":")部分。
或者,
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