0

在 Bob 大叔的简洁架构中,Hanami 的灵感来自于此,Form Objects 保护了交互器和我们的交付机制(通常是一个 http 端点)之间的边界。

在 Hanami 文档中,边界守卫是使用paramsActions 中的块完成的(请参阅此处)。这似乎将验证与 http 传递机制相结合。在我看来,Form Objects(或完成同样事情的黑色参数)将存在于与交付机制无关的交互器中,这似乎更自然。

不幸的是,我不知道 Hanami 是否支持这样的设计。我在花见论坛上发现了一个类似的问题,但没有答案。

为了澄清,下面是一段代码,展示了我想做的事情,但使用VirtusActiveModel::Validations不是 Hanami 设施。对于熟悉 Trailblazer 的人来说,它contract在操作中的块(它的术语为交互器)是另一个例子。

最后,我是否误解了 Hanami 的预期用途?Hanami 支持 Interactors,所以看起来这应该是可能的......

require 'hanami/model'
require 'active_model'
require 'virtus'

class PersonForm
  include Virtus.model
  include ActiveModel::Validations

  attribute :name, String
  attribute :age, Integer

  validates :name, :age, presence: true

  def each
    attributes.each {|a| yield a}
  end
end

class Person
  include Hanami::Entity
  attributes :name, :age
end

# Code like this would then live inside of an Interactor, which
# can accept a params hash.

jonah_form = PersonForm.new({name: 'Jonah', age: '99'})
jonah = Person.new(jonah_form) if jonah_form.valid?
p jonah #=> <Person:0x007fbdde1edcc0 @id=nil @name="Jonah" @age=99>
# do stuff with our jonah entity
4

1 回答 1

1

很抱歉错过了这个问题。

参数充当验证器,以节省开发人员创建和实例化另一个类的时间。在 Ruby 社区,这是一个问题。

DSL 来拯救这种妥协。

如果您更喜欢有一个具体的表单对象,而不是使用Virtusand ActiveModel,您可以只包含Hanami::Validations并具有相同的行为。

于 2016-03-22T17:19:41.660 回答