Json Rails 4使用接受嵌套属性更新嵌套模型
我试图获得一个基于Rails4的api,它不使用视图/表单来接受json对象图并更新所有相关模型。我在主项目上没有任何运气,所以我创建了一个基本项目来尝试让它工作,但我无法让Rails允许嵌套模型的json数据中的元素成为允许的参数 我有三种型号:顶部、中部和底部。顶部有许多中间,中间有许多底部。每次都在数据库中设置,我有一个TopsController,用于接收PUT: app/controllers/api/tops\u controller.rb: 我使用以下方法将其卷曲:Json Rails 4使用接受嵌套属性更新嵌套模型,json,ruby-on-rails-4,Json,Ruby On Rails 4,我试图获得一个基于Rails4的api,它不使用视图/表单来接受json对象图并更新所有相关模型。我在主项目上没有任何运气,所以我创建了一个基本项目来尝试让它工作,但我无法让Rails允许嵌套模型的json数据中的元素成为允许的参数 我有三种型号:顶部、中部和底部。顶部有许多中间,中间有许多底部。每次都在数据库中设置,我有一个TopsController,用于接收PUT: app/controllers/api/tops\u controller.rb: 我使用以下方法将其卷曲: curl -X
curl -X PUT -H "Content-Type: application/json" --data @update.json http://localhost:3000/top/edit
Top.name属性每次都会更新,没有问题,但是中间和底部的数据会被忽略。查看服务器输出,我看到以下内容:
Started PUT "/top/edit" for 127.0.0.1 at 2014-10-09 17:09:24 -0700
Processing by Api::TopsController#update as JSON
Parameters: {"top"=>{"id"=>1, "name"=>"NewTopName", "middles"=>[{"id"=>1, "name"=>"UpdatedMiddleName", "top_id"=>1, "bottoms"=>[{"id"=>1, "name"=>"UpdatedBottomName", "middle_id"=>1}]}]}}
Top Load (0.2ms) SELECT "tops".* FROM "tops" WHERE "tops"."id" = $1 LIMIT 1 [["id", 1]]
Unpermitted parameters: id, middles
...
未经许可的参数:id,middles部分似乎在告诉我,它不能在更新中处理这些middles参数,尽管我在TopsController::top_params方法中允许它们使用:middles_attributes=>[:id,:name]和其他一些方法,包括…:中间层=>[]
很明显,我在这里遗漏了一些东西,但我一辈子都看不到它是什么。有什么建议吗?谢谢 尝试允许底部参数也像:middles\u attributes=>[:id,:name,:top\u id,:bottoms\u attributes=>[:id,:name,middle\u id]]在update.json中,middles\u attributes需要替换键middles,而对于底部,bottoms\u属性也是如此。@rossta-成功了!这仅仅是人们通常使用生成的表单来实现这一目的时所遵循的惯例吗?不管怎样,我爱你就像一个随机的互联网用户爱另一个随机的互联网用户一样:-如果你把你的评论形成一个答案,我会把它标记为接受。anusha-感谢将底部插入许可证行的格式。这也很有魅力@randall它确实是一种命名约定,但它有一个特定的目的,Rails将通过查找名为*\u attributes的键,其中*是依赖模型的名称,尝试从参数映射构建一个依赖对象,例如中间或底部。其原因是对使用接受\u嵌套的\u属性\u。
class Middle < ActiveRecord::Base
belongs_to :top
has_many :bottoms
accepts_nested_attributes_for :bottoms, allow_destroy: true, reject_if: :all_blank
def as_json(options = {})
attrs = self.attributes
attrs['bottoms'] = self.bottoms
attrs
end
end
class Bottom < ActiveRecord::Base
belongs_to :middle
end
{
"top":{
"id":1,
"name":"NewTopName",
"middles":[
{
"id":1,
"name":"UpdatedMiddleName",
"top_id":1,
"bottoms":[
{
"id":1,
"name":"UpdatedBottomName",
"middle_id":1
}
]
}
]
}
}
curl -X PUT -H "Content-Type: application/json" --data @update.json http://localhost:3000/top/edit
Started PUT "/top/edit" for 127.0.0.1 at 2014-10-09 17:09:24 -0700
Processing by Api::TopsController#update as JSON
Parameters: {"top"=>{"id"=>1, "name"=>"NewTopName", "middles"=>[{"id"=>1, "name"=>"UpdatedMiddleName", "top_id"=>1, "bottoms"=>[{"id"=>1, "name"=>"UpdatedBottomName", "middle_id"=>1}]}]}}
Top Load (0.2ms) SELECT "tops".* FROM "tops" WHERE "tops"."id" = $1 LIMIT 1 [["id", 1]]
Unpermitted parameters: id, middles
...