【发布时间】:2014-10-13 20:38:47
【问题描述】:
我在 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
在我的控制器中,我调用: 提交 = ForgetPasswordSubmission.new(email: params[:email])
然后,我检查它是否有效:submission.valid?
如果无效,我会收到两条错误消息:
1 - 如果该字段为空
2 - 如果邮件格式不好
我希望能够具体知道其中存在哪一条消息,因为我想在视图中以不同的方式显示错误。
我的问题是 submit.errors.messages[:email] 是一个符号,它将显示: ["不能为空", "请输入有效的电子邮件。"] 或者 [“请输入有效电子邮件。”] 或者 [“不能为空”] 视情况而定。
我不想这样检查:
submission.errors.messages.each 做 |v| if 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
【问题讨论】:
标签: ruby-on-rails forms ruby-on-rails-4 rails-activerecord activemodel