如何为 ActiveModel 生成 .RBI 文件 Class

How to Generate .RBI file for an ActiveModel Class

我有一个 PORO 用作值对象。我正在通过 include ActiveModel::Model 添加 ActiveModel,以获得给我带来的所有好处。问题是我不知道如何为它生成 RBI 文件以便它通过 srb tc

我目前正在使用 sorbet-rails,因为这是一个 PORO 并且不继承自 ActiveRecordbundle exec rails_rbi:allbundle 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

问题是 sorbet-typed 不包括 ActiveModel::Model,它只是 ActiveModel::Validations 和其他几个的包装。通过切换到仅使用 ActiveModel::Validations,代码现在通过 typed: strict.

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

我输入 ActiveModels 的方法如下。

我创建了一个名为 ApplicationModel 的基础 class。

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

class ExampleModel < ApplicationModel
  attribute :name, :string
end

然后我有一个脚本可以为 ApplicationModel 的子 class 生成 RBI 文件。

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

看看tapioca generates RBI files for ActiveRecord objects如何生成类型签名。