Rails无法识别POST请求中的嵌套JSON对象

时间:2014-04-07 06:43:11

标签: ruby-on-rails json post ruby-on-rails-4 thin

基本上,我有两个模型 - 公司和位置。

class Company < ActiveRecord::Base
  has_many :locations, dependent: :destroy
  accepts_nested_attributes_for :locations # Not sure if needed.
end

class Location < ActiveRecord::Base
  belongs_to :company
end

创建公司时(即POST到/companies),我希望能够在同一个请求中创建其位置。但由于某种原因,我无法让Rails识别嵌套在公司内部的Locations数组。它似乎将嵌套的JSON数组撕掉并将其放入&#34; root&#34; JSON请求。

使用cURL的示例POST请求:

curl -X POST -H "Accept: Application/json" -H "Content-Type: application/json" http://example.com/companies -d '{"employee_count":320,"locations":[{"lat":"-47.5", "lon":"120.3"},{"lat":"78.27", "lon":"101.09"}]}'

示例服务器输出:

Started POST "/companies"
Processing by CompaniesController#create as Application/json
Parameters: {"employee_count"=>320, "locations"=>[{"lat"=>"-47.5", "lon"=>"120.3"}, {"lat"=>"78.27", "lon"=>"101.09"}], "company"=>{"employee_count"=>320}}

如您所见,locations数组不再位于company对象内,因此当CompaniesController #creu attempts尝试创建Company实例时,它的位置数组为{{1 }}。此外,nil属性重复两次,这也有点奇怪。 有谁知道为什么会发生这种情况以及如何解决?

作为参考,这就是我的CompaniesController中的白名单:

employee_count

我的服务器很精简(1.6.2),它几乎是一个全新/默认的Rails应用程序,没有特殊配置。

1 个答案:

答案 0 :(得分:1)

好的,看起来我需要在我的POST请求中将locations重命名为locations_updates(感谢评论中的用户提出此建议)。

我还需要将所有属性封装在&#34;外部&#34; company对象,而不是在&#34; root&#34; JSON。例如:

curl -X POST -H "Accept: Application/json" -H "Content-Type: application/json" http://example.com/companies -d '{"company":{"employee_count":320,"locations":[{"lat":"-47.5", "lon":"120.3"},{"lat":"78.27", "lon":"101.09"}]}}'