0

解决了!

孩子们,不要定义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

我不明白这里到底发生了什么以及为什么发生。提前致谢

编辑:在帖子顶部添加了“解决方案”

4

2 回答 2

0

我以前没有遇到过这个问题,但它看起来像是一个潜在的冰糕错误。

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 吗?看起来它对另一个序列化器中的属性没有问题。

于 2020-05-23T02:14:25.077 回答
0

如果你定义read_attribute_for_serialization不要这样做:

  sig { params(attr: Symbol).void }
  def read_attribute_for_serialization(attr)
    public_send(attr)
  end
于 2020-05-25T11:03:18.237 回答