1

我有一个 PORO 用作值对象。我正在通过include ActiveModel::Model为我带来的所有细节添加 ActiveModel。问题是我无法弄清楚如何为它生成 RBI 文件以便它通过srb tc

我目前正在使用sorbet-rails并且因为这是一个 PORO 并且不继承自ActiveRecordbundle exec rails_rbi:all或者bundle exec rails_rbi:models即使我将它放在模型目录中(它不应该存在)也不会为此生成 .rbi 文件。

可以手动编写 .rbi 文件,但我真的不想这样做。有没有办法可以自动生成它们?

这是我需要 RBI 文件的模块的简化示例

module MyModule
  class MyClass
    include ActiveModel::Model
    extend T::Sig

    VALID_VARIANTS = T.let(['Enum1', 'Enum2'], T::Array[String])

    sig { returns(String) }
    attr_accessor :variant

    validates :variant, presence: true, inclusion: { in: VALID_VARIANTS }
    validate :enum_1_is_valid, if: Proc.new { |a| a.variant == 'Enum1' }

    private

    sig { void }
    def enum_1_is_valid
      # ...
    end
  end
end
4

2 回答 2

0

问题是sorbet-typed不包括ActiveModel::Model这只是一个包装器ActiveModel::Validations和其他一些。通过切换到仅使用ActiveModel::Validations,代码现在通过了typed: strict

这样做的主要缺点是我们没有得到很好的自动属性分配,仍然需要使用初始化程序。没什么大不了的,但并不完美。

于 2020-09-16T02:26:05.720 回答
0

我输入 ActiveModels 的方法如下。

我创建了一个名为ApplicationModel.

class ApplicationModel
  extend T::Sig
  include ActiveModel::Model
  include ActiveModel::Validations
  include ActiveModel::Attributes
end

class ExampleModel < ApplicationModel
  attribute :name, :string
end

然后我有一个脚本,它为ApplicationModel.

ApplicationModel.subclasses.each do |model|
  # Generate RBI files.
end

看看木薯如何为 ActiveRecord 对象生成 RBI 文件,了解如何生成类型签名。

于 2021-03-12T16:42:04.690 回答