【问题标题】:Rails not recognizing nested JSON objects in POST requestRails 无法识别 POST 请求中的嵌套 JSON 对象
【发布时间】:2014-04-07 06:43:11
【问题描述】:

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

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

创建公司时(即发送到/companies 的帖子),我希望能够在同一个请求中创建其位置。但由于某种原因,我无法让 Rails 识别嵌套在 Company 内的位置数组。它似乎撕掉了嵌套的 JSON 数组并将其放入 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#create 尝试创建 Company 实例时,它的 Locations 数组是 nil。此外,employee_count 属性重复了两次,这也有点奇怪。 有谁知道为什么会发生这种情况以及如何解决?

作为参考,我的 CompaniesController 中的白名单如下所示:

params.require(:company).permit(
  :employee_count,
  locations: [:lat, :lon]
)

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

【问题讨论】:

  • 检查这个:stackoverflow.com/questions/845366/…它可能对你有帮助!
  • 强参数中的嵌套属性应该这样调用:locations_attributes(都是复数)。
  • @rails4guides.com 没错!
  • 您必须向我们展示您的表单和new / create 控制器操作——您遇到的问题是您没有正确传递嵌套属性(您必须构建 ActiveRecord 对象当您发送请求时等)。如果您向我们展示您的控制器操作和表单,我可以写一些帮助

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


【解决方案1】:

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

我还需要将所有属性封装在“外部”company 对象中,而不是位于 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"}]}}'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 2015-03-19
    • 2019-12-18
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 2017-05-19
    相关资源
    最近更新 更多