我在Rails中遇到问题,包含ActiveModel错误消息。
我的问题是:"当我验证和ActiveModel元素时,是否有可能知道具体生成错误的条件?"
让我解释一下情况:
我正在创建一个忘记密码"页。
表单只包含一个字段:用户的电子邮件,必须存在且具有电子邮件格式。
我创建了一个ActiveModel来验证表单:
class ForgetPasswordSubmission
include ActiveModel::Validations
include ActiveModel::Serialization
validates :email, presence: true, email: { id: "not_email", message: "Please enter a valid email."}
attr_accessor :attributes
def initialize(attributes = {})
@attributes = attributes
end
def read_attribute_for_validation(key)
@attributes[key]
end
end
在我的控制器中,我打电话给: submission = ForgetPasswordSubmission.new(email:params [:email])
然后,我检查它是否有效:submission.valid?
如果无效,我可以收到两条错误消息:
1 - 如果该字段为空
2 - 如果电子邮件的格式不合适
我希望能够明确知道这些消息中的哪一个存在,因为我想在视图中以不同的方式显示错误。
我的问题是submission.errors.messages [:email]是一个符号,它将显示: ["不能为空白","请输入有效的电子邮件。"] 要么 ["请输入有效的电子邮件。"] 要么 ["不能空白"] 视情况而定。
我不想那样检查:
submission.errors.messages.each do | v | 如果v =="请输入有效的电子邮件" ... elsif ... 因为更改我的错误消息会破坏测试。我宁愿对一个不会改变的参数进行测试。
所以我的问题是:有没有办法测试错误消息是否来自 存在:真 要么 电子邮件:真
在我的模特中?
非常感谢你的帮助!
编辑: 感谢Laurence我找到的解决方案是为我的模型添加一个方法:
def good_email_format?
if !@attributes[:email].present?
return false
elsif @attributes[:email].present? && !@attributes[:email].valid?
return false
else
return true
end
end
答案 0 :(得分:1)
你不能使用“礼物”吗?测试其存在的方法。
user.email.present?
然后使用“有效?”测试其他验证的方法。
user.email.valid?
否则,您可以在模型中编写一个方法来进行该测试。类似的东西:
def is_email_blank?
self.email.blank?
end
然后像这样做你的逻辑:
if user.is_email_blank?
[logic]
else
[logic]
end
祝你好运。