Ruby on rails 检查模型的哪个特定验证失败-ActiveModel验证
我在Rails中遇到了一个问题,ActiveModel错误消息 我的问题是:“当我验证和激活模型元素时,是否可能知道具体是从哪个条件生成了错误?” 让我解释一下情况: 我正在创建一个“忘记密码”页面 表单只接受一个字段:用户的电子邮件,该字段必须存在并具有电子邮件的格式 我创建了一个ActiveModel来验证表单:Ruby on rails 检查模型的哪个特定验证失败-ActiveModel验证,ruby-on-rails,forms,ruby-on-rails-4,rails-activerecord,activemodel,Ruby On Rails,Forms,Ruby On Rails 4,Rails Activerecord,Activemodel,我在Rails中遇到了一个问题,ActiveModel错误消息 我的问题是:“当我验证和激活模型元素时,是否可能知道具体是从哪个条件生成了错误?” 让我解释一下情况: 我正在创建一个“忘记密码”页面 表单只接受一个字段:用户的电子邮件,该字段必须存在并具有电子邮件的格式 我创建了一个ActiveModel来验证表单: class ForgetPasswordSubmission include ActiveModel::Validations include 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(电子邮件:params[:email])
然后,我检查它是否有效:submission.valid
如果无效,我可能有两条错误消息:
1-如果字段为空
2-如果电子邮件的格式不好
我希望能够明确知道这些消息中存在哪一条,因为我希望在视图中以不同的方式显示错误
我这里的问题是submission.errors.messages[:email]是一个符号,它将显示:
[“不能为空”,“请输入有效电子邮件。”]
或
[“请输入有效的电子邮件。”]
或
[“不能为空”]
视情况而定
我不想这样检查:
submission.errors.messages.each do|v|
如果v==“请输入有效的电子邮件”。。。
埃尔西夫。。。
因为更改我的错误消息将中断测试。我宁愿对一个不会改变的参数进行测试
所以我的问题是:有没有办法测试错误消息是否来自
存在:真实
或
电子邮件:真的
在我的模型中
非常感谢你的帮助
编辑:
感谢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
你不能用“现在”方法来测试它是否存在吗
user.email.present?
然后使用“valid?”方法测试其他验证
user.email.valid?
否则,您可以在模型中编写一个方法来进行该测试。比如:
def is_email_blank?
self.email.blank?
end
然后你的逻辑是这样的:
if user.is_email_blank?
[logic]
else
[logic]
end
祝你好运。谢谢你的帮助,劳伦斯。你帮我找到了解决办法。正如您所建议的,我在模型中添加了一个方法:def good_email_format?如果@属性[:电子邮件]。是否存在?返回false elsif@attributes[:email]。是否存在?&&@属性[:电子邮件]。有效吗?返回false,否则返回true,很高兴它有帮助。谢谢你接受我的回答。这给了我足够的声誉,现在可以发布照片了,哈哈。啊哈,我也在和低声誉作斗争。:)