检查模型的哪个特定验证失败 - ActiveModel验证

时间:2014-10-13 20:38:47

标签: ruby-on-rails forms ruby-on-rails-4 rails-activerecord activemodel

我在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

1 个答案:

答案 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
祝你好运。