我想寫一個處理JSON的更新方法。該JSON看起來是這樣的:如何在處理JSON時使用nested_attributes?
{
"organization": {
"id": 1,
"nodes": [
{
"id": 1,
"title": "Hello",
"description": "My description."
},
{
"id": 101,
"title": "fdhgh",
"description": "My description."
}
]
}
}
組織模式:
has_many :nodes
accepts_nested_attributes_for :nodes, reject_if: :new_record?
組織串行:
attributes :id
has_many :nodes
節點串行器:在組織控制
attributes :id, :title, :description
更新方法:
def update
organization = Organization.find(params[:id])
if organization.update_attributes(nodes_attributes: node_params.except(:id))
render json: organization, status: :ok
else
render json: organization, status: :failed
end
end
private
def node_params
params.require(:organization).permit(nodes: [:id, :title, :description])
end
我也嘗試添加accepts_nested_attributes_for
該組織串行,但似乎並沒有因爲它產生錯誤(undefined method 'accepts_nested_attributes_for'
)是正確的,所以我只加accepts_nested_attributes_for
到模型中並沒有給串行器。
上面的代碼生成以下錯誤,參考更新方法中的update_attributes
行。我究竟做錯了什麼?
no implicit conversion of String into Integer
在調試器node_params
回報:
Unpermitted parameters: id
{"nodes"=>[{"id"=>101, "title"=>"gsdgdsfgsdg.", "description"=>"dgdsfgd."}, {"id"=>1, "title"=>"ertret.", "description"=>"etewtete."}]}
更新:得到它使用的工作如下:
def update
organization = Organization.find(params[:id])
if organization.update_attributes(nodes_params)
render json: organization, status: :ok
else
render json: organization, status: :failed
end
end
private
def node_params
params.require(:organization).permit(:id, nodes_attributes: [:id, :title, :description])
end
要我加root: :nodes_attributes
串行。
現在所有的作品,但我很關心包括在node_params
的id。那安全嗎?現在不可以編輯organization
和node
(不應該被允許)的ID嗎? 請問下面是一個妥善的解決辦法,以使其無法更新的ID:
if organization.update_attributes(nodes_params.except(:id, nodes_attributes: [:id]))
我認爲你需要從params中刪除節點。您無法使用update_attributes以這種方式設置節點。 – Swards