代码之家  ›  专栏  ›  技术社区  ›  xcskier56

如何为ActiveModel类生成RBI

  •  0
  • xcskier56  · 技术社区  · 4 年前

    我有一个PORO,我用它作为值对象。我正在通过添加ActiveModel include ActiveModel::Model srb tc

    我当前正在使用 sorbet-rails 因为这是一个波罗,并没有继承 ActiveRecord , bundle exec rails_rbi:all bundle exec rails_rbi:models

    手动编写.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
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   xcskier56    4 年前

    问题是 sorbet-typed 不包括 ActiveModel::Model 只是一个包装纸 ActiveModel::Validations 还有一些其他的。通过切换到只使用 ActiveModel::验证 typed: strict .

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