sorbet - ActiveModelSerializer 和 VOID 类型响应
问题描述
解决了!
孩子们,不要定义read_attribute_for_serialization
返回void
所以我正在尝试将冰糕集成到我的一个 Rails 应用程序中。我已经在 Gemfile 中添加了冰糕
gem "sorbet-runtime", "~> 0.5.5657"
gem "sorbet-rails", "~> 0.6.5.1"
gem "sorbet", "~> 0.5.5657", group: [:development, :test]
一切看起来都不错,我能够在Price
类中添加 sigs 并解决应用程序内的类型检查问题。
我遇到的问题是序列化程序的返回值
所以序列化器看起来大致是这样的
# typed: false
# frozen_string_literal: true
class MySuperAwesomeSerializer < ActiveModel::Serializer
attributes :start_date
has_one :price, serializer: PriceSerializer
end
在规范中,当我想验证关联 ( has_one
) 属性的返回值时,我得到了这个
{
start_date: 2020-05-22,
price: {
total_amount: T::Private::Types::Void::VOID,
taxless_amount: T::Private::Types::Void::VOID,
vat_amount: T::Private::Types::Void::VOID
}
}
价格序列化器看起来大致是这样的
# typed: false
# frozen_string_literal: true
class PriceSerializer < ActiveModel::Serializer
attributes :taxless_amount, :total_amount, :vat_amount
end
我不明白这里到底发生了什么以及为什么发生。提前致谢
编辑:在帖子顶部添加了“解决方案”
解决方案
我以前没有遇到过这个问题,但它看起来像是一个潜在的冰糕错误。
T::Private::Types::Void::Void
是 sorbet 为具有void
作为返回类型的方法换出的返回类型。在这种情况下,您没有sig
为 the定义任何内容,attributes
因此它不应该存根返回值。
要解决此问题,您可以为这些属性定义显式 sig,例如
sig { returns(Integer) }
def taxless_amount
...
end
我没有尝试过,但这也可能有效
sig { returns(Integer) }
attributes :taxless_amount
编辑:你能显示实际的 PriceSerializer 类 btw 吗?看起来它对另一个序列化器中的属性没有问题。
推荐阅读
- javascript - 节点js,函数不等待响应
- r - x 轴上带有时间的华夫饼图
- python - 从 python 框架向 sudoed C 子进程发送 Ctrl+C SIGINT
- javascript - JQuery最接近的标签不适用于带有名称的输入
- javascript - javascript中的缩放和逆缩放数字?
- django - 使用不可变部署策略将 Django 部署到 Elastic Beanstalk 时没有此类文件或目录
- google-sheets - Google 表格从单列中的唯一值中获取平均值
- c# - 如何指定从哪个项目获取 Excel 文件的路径?
- java - 是否可以覆盖弹簧安全认证错误消息
- typescript - 如何从两个对象数组中返回一个字符串?