如何为 ActiveModel 生成 .RBI 文件 Class
How to Generate .RBI file for an ActiveModel Class
我有一个 PORO 用作值对象。我正在通过 include ActiveModel::Model
添加 ActiveModel,以获得给我带来的所有好处。问题是我不知道如何为它生成 RBI 文件以便它通过 srb tc
我目前正在使用 sorbet-rails
,因为这是一个 PORO 并且不继承自 ActiveRecord
,bundle 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
问题是 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如何生成类型签名。
我有一个 PORO 用作值对象。我正在通过 include ActiveModel::Model
添加 ActiveModel,以获得给我带来的所有好处。问题是我不知道如何为它生成 RBI 文件以便它通过 srb tc
我目前正在使用 sorbet-rails
,因为这是一个 PORO 并且不继承自 ActiveRecord
,bundle 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
问题是 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如何生成类型签名。