【问题标题】:2 field validation in Hanami + dry-validation2 Hanami中的现场验证+干验证
【发布时间】:2017-11-15 13:02:51
【问题描述】:

我一直在尝试使用 Hanami(在 dry-validation 之上)验证登录过程。

重点是:如何验证与 2 个字段相关的内容:电子邮件 + 密码?

我读过自定义谓词,但它们似乎只针对每个字段。另一个概念是规则,但根据示例,它并没有按照我需要的方式关联两件事。

这是我的代码:

module Web::Controllers::Sessions
  class Create
    include Web::Action

    expose :validation # my standard way to show errors in the template

    def call(params)
      @validation = SigninValidator.new(params[:user]).validate
      if @validation.success? 
      # more stuff here
    end
  end
end

class SigninValidator
  include Hanami::Validations::Form

  validations do
    required(:email) { format?(EMAIL_REGEX)}
    required(:password).filled(:str?)

    # I GOT CONFUSED HERE
    # how could I use someting like a repository and relate something like 
    # predicate + message for "email or password doesn't match"

  end
end

不幸的是,validations section in Hanami Guide 是空的,我找不到查看源代码的解决方案(hanami-validation 和 dry-validation)。

任何帮助将不胜感激。

【问题讨论】:

    标签: ruby validation hanami


    【解决方案1】:

    我不完全理解您想要实现的目标,您似乎在尝试验证电子邮件和/或密码是否与您数据库中的匹配?如果是这样,那么您做错了地方,验证器旨在验证 仅参数。因此,如果电子邮件格式错误,或者密码和密码确认不匹配,验证可以捕获并提供正确的错误消息。如果您希望根据数据库验证详细信息,那么这应该在交互器中完成。

    m45t3r 说得对,如果您确实想验证两个依赖属性,那么规则可能就是要走的路。

    至于您断开的链接,Hanami 指南被移动了一段时间,旧链接似乎没有被转发得太好!可以在 here 找到当前的验证文档,特别是规则。

    【讨论】:

      【解决方案2】:

      您可以使用High-Level RulesCustom Validation Blocks。像这样的:

      validations do
        required(:email) { format?(EMAIL_REGEX)}
        required(:password).filled(:str?)
      
        rule(:email_and_password: [:email, :password]) do |email, password|
          # Example, do what you need here
          # Only dry-rb rules are valid here
          email.filled? & password.filled?
        end
      
        # Or
      
        validate(:email_and_password: [:email, :password]) do |email, password|
          # Example, do what you need here
          # Any Ruby code is valid here
          email.filled? && password.filled?
        end
      end
      

      也许您需要在此处将 :email:password 设置为可选,并确保将它们填充在 rulevalidate 块内。

      【讨论】:

      • 嘿,迭戈!此外,正如您所说,您希望针对外部依赖项(存储库)进行验证,最好查看此dry-rb.org/gems/dry-validation/basics/working-with-schemas 请参阅configure 块内的option。 @m45t3r 提到的 optionvalidate 结合起来应该可以解决问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多