强参数:如何处理嵌套的 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.

有没有人看到我做错了什么并编写此更新方法?

unless n.update_attributes(node_params)行上,您尝试使用 nodes_params 更新节点n,这是 JSON 中的所有节点减去 id:

{"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

相关内容

  • 没有找到相关文章

最新更新