Rails Active Model Serializer JSON API 序列化将下划线变为横线,那客户端提交数据的时候怎么处理?

harryyoung · November 05, 2016 · Last by darkbaby123 replied at November 12, 2016 · 2193 hits

Active Model Serializer JSON API 序列化将键中的下划线变为横线,我知道可以修改设置不进行转换,但似乎转为横线更符合规范吧(不确定)。

但是客户端在提交数据的时候,如果用横线,那 params 中键都是横线,就没办法直接用,需要转换。另一种是直接让客户端提交下划线的,但感觉 API 出去的都是横线,提交的时候又是下划线,很不一致。

所以这种情况怎么处理?感觉还是让客户端提交横线的比较一致,那么 Active Model Serializer Deserialize 的时候有办法自动转为下划线,还是要手动转?

横线(也就是 dash,连接符)在 JSON API 中只是一个推荐,不是强制的。它曾经是一个必须遵循的规范,但当时经过很多人的反对(具体可以查 GitHub issue),而维护者拿出的理由主要有两点:

  • dash 是 url safe 的。
  • 维护者不希望 JSON payload 在客户端被直接当成 JS object 使用。dash 增加了直接使用的难度,强迫开发者在客户端做 deserialize 的工作。

可见这两个理由都是站不住脚的。所以最后这个就变成了推荐而不是规范强制执行的一部分了。目前也没有说哪种比其他几种更好的说法,所以这点随你喜好,比如你都可以用下划线,前后端都方便了,只是前端看着不那么协调,毕竟 JS 一般是驼峰命名的。

废话了这么多,只是想表达一点。横线不是规范,所以不用在意违背了它就是政治不正确的做法。广义一点说,世上就没有绝对正确的做法,只有适合自己的做法。

@darkbaby123 谢谢你有见地的回复,帮我弄清了这背后的原因。最后我还是遵循了推荐规范,API 给出和接接收的数据都是 dash 连接。给出的时候接受 Active Model Serializer 的默认设置;接收的时候增加了一个 Filter:

# Transform keys in json api data, '-' to '_'
def transform_param_keys
  params[:data][:attributes].transform_keys! { |key| key.to_s.tr("-", "_") } if request.headers['Content-Type'] == 'application/vnd.api+json'
end

从而将所有请求的数据中的 dash 转为 underscore。

可以在 initializer 里面设置 ActiveModelSerializer 的 key_transform 属性: doc here

unalter 的效率会比较高

#2 楼 @harryyoung AMS 有从 params 反序列化出来的方法,不过还在试验阶段。见 deserialization 。有时候自己实现一个反而简单,如果有更复杂的需求,可以参考下它的设计和源码。

#4 楼 @darkbaby123 deserialization 我前面就用了,但它不会自动将 dash 转为 underscore。

#5 楼 @harryyoung 嗯,我并没有用过这个功能,所以不了解。

You need to Sign in before reply, if you don't have an account, please Sign up first.