我试图获取基于Rails 4的api(不使用视图/表单)来接受json对象图并更新所有相关模型。我在主项目上没有任何运气,所以我创建了一个基本项目,试图让它工作,我不能让Rails允许嵌套模型的json数据中的元素被允许"允许& #34;参数。
我有三种型号:顶部,中部和底部。 Top有许多Middles,Middle有很多Bottous。 Everyting是在数据库中设置的,我有一个TopsController,我用它来接收PUT:
应用/控制器/ API / tops_controller.rb:
class Api::TopsController < ApplicationController
respond_to :json
def show
all = Top.all
render json: { result: "success", tops: all }
end
def update
top = Top.find(params[:top][:id])
top.update(top_params)
render json: { result: "updated", top: top }
end
private
def top_params
params.require(:top).permit(:name, :middles_attributes => [:id, :name])
end
end
应用/模型/ top.rb:
class Top < ActiveRecord::Base
has_many :middles
accepts_nested_attributes_for :middles, allow_destroy: true, reject_if: :all_blank
def as_json(options = {})
attrs = self.attributes
attrs['middles'] = self.middles
attrs
end
end
应用/模型/ middle.rb:
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
应用/模型/ bottom.rb:
class Bottom < ActiveRecord::Base
belongs_to :middle
end
这是我在服务器上的update.json文件:
{
"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
每次都更新Top.name属性,没问题,但忽略了Middle和Bottom数据。查看服务器输出,我看到了:
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
...
Unpermitted parameters: id, middles
部分似乎告诉我它不能(不会)在更新中处理这些middles参数,即使我已在TopsController中允许它们: :top_params方法使用:middles_attributes => [:id, :name]
(以及其他一些方法,包括... :middles => []
)。
我在这里明显遗漏了一些东西,但我不能为我的生活看到它是什么。有什么建议?谢谢!