我一直在尝试使用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)。
任何帮助都将不胜感激。
答案 0 :(得分:2)
您可以使用High-Level Rules或Custom 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
设置为可选,并确保它们在rule
或validate
阻止内填充。
答案 1 :(得分:0)
我不完全了解您要实现的目标,似乎您正在尝试验证电子邮件和/或密码是否与数据库中的电子邮件和/或密码匹配?如果是这样,则说明您在错误的地方进行了验证,验证器仅用于验证 params 。因此,如果电子邮件格式错误,或者密码和密码确认不匹配,验证可以捕获该错误并提供正确的错误消息。如果您要根据数据库验证详细信息,那么这应该在交互器中完成。
m45t3r的正确说法是,如果您确实想验证两个相关属性,那么一条规则可能就是正确的做法。
至于您断开的链接,Hanami指南又向前移动了一段时间,旧链接似乎转发得还不够好! here是最新的验证文档,尤其是规则。