2016-01-16 56 views
3

我想寫一個處理JSON的更新方法。該JSON看起來是這樣的:強參數:如何處理嵌套的json代碼?

{ 
    "organization": { 
    "id": 1, 
    "nodes": [ 
     { 
     "id": 1, 
     "title": "Hello", 
     "description": "My description." 
     }, 
     { 
     "id": 101, 
     "title": "fdhgh", 
     "description": "My description." 
     } 
    ] 
    } 
} 

我的更新方法如下:

def update 
    organization = Organization.find(params[:id]) 
    nodes = params[:organization][:nodes] 
    nodes.each do |node| 
     n = Node.find(node[:id]) 
     unless n.update_attributes(node_params) 
     render json: organization, status: :failed 
     end 
    end 
    render json: diagram, status: :ok 
    end 

    private 
    def node_params 
     params.require(:organization).permit(nodes: [:title, :description]) 
    end 

不幸的是,n.update_attributes(node_params)產生:

Unpermitted parameter: id 
Unpermitted parameter: id 
Unpermitted parameter: id 
    (0.2ms) BEGIN 
    (0.3ms) ROLLBACK 
*** ActiveRecord::UnknownAttributeError Exception: unknown attribute 'nodes' for Node. 

有誰看到我做錯了什麼,並寫這個更新方法?

+0

您嘗試更新節點的更新方法位於組織控制器中嗎? –

+0

是的,它在組織控制器中。 – Nick

+0

然後,您可以使用節點的嵌套屬性,以便具有相同組織的所有節點都將得到保存和更新 –

回答

2

unless n.update_attributes(node_params)線,你想用nodes_params,這些都是從你的JSON的節點減去IDS的更新節點n

{"nodes"=>[{"title"=>"Hello", "description"=>"My description."}, {"title"=>"fdhgh", "description"=>"My description."}]}

您可以只添加:id作爲允許節點參數,刪除nodes分配步驟,改爲反覆更換node_params,並且在更新節點n時只是省略:id。例如,

def update 
    organization = Organization.find(params[:id]) 
    node_params.each do |node| 
    n = Node.find(node[:id]) 
    unless n.update_attributes(node.except(:id)) 
     render json: organization, status: :failed 
    end 
    end 
    render json: diagram, status: :ok 
end 

private 
    def node_params 
    params.require(:organization).permit(nodes: [:id, :title, :description]) 
    end 
+0

謝謝,我試過了。 'n = Node.find(node [:id])'由於TypeError(Symbol沒有隱式轉換爲Integer)而失敗。在該行使用'debugger','node'返回:'[「nodes」,[{「id」=> 1,「title」=>「title」,「description」=>「Desc。」},{ id「=> 101,」title「=>」fdhgh「,」description「=>」嗨。「}]]'。所以它似乎仍然是一個數組。有沒有辦法解決這個問題? – Nick

+0

因此,'node_params'和'node'返回相同的輸出,不同之處在於'node_params'在'{...}之間包含了所有(即2個節點)「,而'node'包含了'[...] '(但仍然有2個節點,所以不是「每個」)。 – Nick

+0

是的!如果我將該行更改爲'node_params [:nodes] .each do | node |'而不是它的工作原理。整個設置是否仍然是安全/安全的更新方式? – Nick