4

我一直在尝试使用 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

不幸的是,Hanami Guide 中的验证部分是空的,我找不到查看源代码的解决方案(hanami-validation 和 dry-validation)。

任何帮助,将不胜感激。

4

2 回答 2

3

您可以使用高级规则自定义验证块。像这样的东西:

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阻塞。

于 2017-06-13T17:05:33.420 回答
0

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

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

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

于 2019-06-05T10:55:02.877 回答