Hanami +干验证中的2个现场验证

时间:2017-06-13 16:18:04

标签: ruby validation hanami

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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阻止内填充。

答案 1 :(得分:0)

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

m45t3r的正确说法是,如果您确实想验证两个相关属性,那么一条规则可能就是正确的做法。

至于您断开的链接,Hanami指南又向前移动了一段时间,旧链接似乎转发得还不够好! here是最新的验证文档,尤其是规则。