Rails不会在参数中嵌套嵌套的JSON对象

时间:2014-11-27 12:44:12

标签: ruby-on-rails ruby json rest post

我将以下JSON发布到我的'user_controller'控制器类中的rails create方法。

{"user_detail_attributes": 
    {
    "login":"dan123456",
    "password":"password",
    "password_confirmation":"password"
    },
"surname":"REST_TEST",
"firstname":"REST_TEST",
"phone":"0456782",
"grad_year":2010,
"jobs":false,
"email":"REST_TEST@EMAIL.co.uk"
}

我的user_params如下:

params.require(:user).permit(
:surname, :firstname, :phone, :grad_year, :jobs, :email, 
user_detail_attributes: [:id, :password,     :password_confirmation, :login])

然后Rails应该将此json映射到用户。

因此params变量应该包含一个用户,在该用户内部应该是属性包括 user_detail_attributes。

然而,user_detail属性出现在用户params变量之外,作为一个完全独立的params变量,与用户params处于同一级别。

那么,应该发生什么:

user
    +surname
    +firstname
    .
    .
    .
    +user_detail_attributes
        +login
        +password
        +password_confirmation

实际发生了什么:

user_detail_attributes
    +login
    +password
    +password_confirmation
user
    +surname
    +firstname
    .
    .
    .

然后导致用户被映射到我的数据库中的用户表,但没有user_details被映射到该表。

有谁知道为什么会这样,以及我是否可以修复它?如果我需要使用JSON格式或rails应用程序中的某些东西。

谢谢,

编辑:已修复

2 个答案:

答案 0 :(得分:0)

根据Strong Parameters Documentation

你应该这样做:

parameters.require(:user).permit(:surname, :firstname, :phone, :grad_year, :jobs, :email, {user_detail_attributes: [:login, :password, :password_confirmation] })

请注意{}

之前和之后的user_detail_attributes

我在测试台中的测试

hash = {user: {user_detail_attributes: { login: "dan123456", password: "password", password_confirmation: "password"}, surname:"REST_TEST", firstname:"REST_TEST", phone:"0456782", grad_year:2010, jobs:false, email:"REST_TEST@EMAIL.co.uk"} }

params =  ActionController::Parameters.new(params)

parameters.require(:user).permit(:surname, :firstname, :phone, :grad_year, :jobs, :email, {user_detail_attributes: [:login, :password, :password_confirmation] })

Outuput:

 {"surname"=>"REST_TEST", "firstname"=>"REST_TEST", "phone"=>"0456782", "grad_year"=>2010, "jobs"=>false, "email"=>"REST_TEST@EMAIL.co.uk", "user_detail_attributes"=>{"login"=>"dan123456", "password"=>"password", "password_confirmation"=>"password"}}

答案 1 :(得分:0)

我已经解决了这个问题。

JSON的格式应如下:

{"user":
    {"user_detail_attributes": 
        {
        "login":"dan123456",
        "password":"password",
        "password_confirmation":"password"
        },
    "surname":"REST_TEST",
    "firstname":"REST_TEST",
    "phone":"0456782",
    "grad_year":2010,
    "jobs":false,
    "email":"REST_TEST@EMAIL.co.uk"
    }
}

我在开始时缺少用户属性,因为这是我的c#JSON编码器从我的user和user_detail_attribute类格式化JSON的方式。

我通过手动创建JSON进行了游戏,结果证明这是修复。

感谢大家的帮助:)