【问题标题】:strong params JSON API specification强参数 JSON API 规范
【发布时间】:2018-12-22 06:21:29
【问题描述】:

我正在使用 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] } } })

但是当我打印方法的返回时,什么都没有返回

【问题讨论】:

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


    【解决方案1】:

    您是否考虑过使用 gem 从 Ruby 对象转换为 JSON:API 序列化对象。 JSONAPI::Resources 对正确设置参数有很大帮助,因为您只需定义一个 JSONAPI:Resource 并告诉它允许什么。

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

    用户参数:{data:{attributes:{name:x,age:y,relationships:{z}}}}

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

    【讨论】:

      【解决方案2】:

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

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

      改为尝试:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2019-01-29
          • 2015-08-25
          • 2020-08-03
          • 2016-02-04
          • 2021-04-26
          • 2022-07-12
          • 1970-01-01
          • 2019-04-02
          • 2013-01-04
          相关资源
          最近更新 更多