首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Hanami中实现表单对象

在Hanami中实现表单对象
EN

Stack Overflow用户
提问于 2016-02-02 01:20:58
回答 1查看 434关注 0票数 0

在Bob大叔的简洁架构中,表单对象保护着Interactor和我们的交付机制(通常是一个http端点)之间的边界。

在花海文档中,边界保护是使用操作中的params块(see here)来完成的。这似乎将验证与http传递机制耦合在一起。对我来说,表单对象(或完成相同任务的参数黑色)将存在于交付机制不可知的Interactor中似乎更自然。

不幸的是,我不知道Hanami是否支持这样的设计。我在花美论坛上找到了一个similar question,但是它没有答案。

为了澄清,下面的代码片段演示了我想要做的事情,但使用的是VirtusActiveModel::Validations,而不是花美工具。对于那些熟悉Trailblazer的人来说,它的操作中的contract块(Interactor的术语)是另一个例子。

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2016-03-23 01:19:42

很抱歉错过了这个问题。

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

DSL来拯救这一妥协。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35136512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档