强大的参数JSON API规范

时间:2018-07-13 20:28:49

标签: ruby-on-rails strong-parameters json-api

我正在Rails 5.2中使用REST API,并且正在遵循JSON API规范。我的JSON是这样的:

{  
  "data":{  
    "attributes":{  
      "name":"Gleydson",
      "age":"30"
    },
    "relationships":{  
      "occupation":{  
        "data":{  
          "attributes": {
             "name": "Teacher",
          }
        }
      }
    }
  }
}

我有以下方法 user_params

    params.require(:data).require(:attributes)
        .permit(:name, :age, 
       relationships: { occupation: { data: { attributes: [:name] } } })

但是当我打印方法的返回时,什么也不会返回

3 个答案:

答案 0 :(得分:1)

您是否曾经研究过使用gem从Ruby对象转换为JSON:API序列化对象。 JSONAPI::Resources可以帮助您正确设置参数,因为您只需定义JSONAPI:Resource并告知允许的内容即可。

我认为您的问题的一部分是在JSON:API中,属性和关系键是同级

user_params:{data:{attributes:{name:x,age:y,relationships:{z}}}}

jsonapi是:{data:{attributes:{name:x,age:y},relationships:{z}}}

答案 1 :(得分:0)

在JSON API规范中,“属性”和“关系”是同级兄弟。

在您的示例中,您将“关系”嵌套在“属性”中。

代替尝试:

params.require(:data).permit({
  attributes: [:name, :age], 
  relationships: { 
    occupation: { 
      data: { 
        attributes: [:name]
      }
    }
  }
})

答案 2 :(得分:-1)

根据 spec,属性不应显示在关系的数据成员下。关系的数据成员是一个资源标识符对象,这意味着它仅(且必须)包含类型和 id。

对于 JSON:API 合规性检查,您可能需要查看新的 ruby​​ gem easy-jsonapi。它有一个非常容易使用的中间件和响应验证器,带有直观的错误消息,告诉您为什么您的文档、请求和响应不合规。它还与 JSONAPI-SERIALIZER 搭配得很好,正如@robertoplancarte 所建议的那样,它可以获取您的 ruby​​ 对象并将它们序列化为 JSON:API 兼容的 JSON 文档。