Ruby on rails 检查模型的哪个特定验证失败-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::

我在Rails中遇到了一个问题,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(电子邮件: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,很高兴它有帮助。谢谢你接受我的回答。这给了我足够的声誉,现在可以发布照片了,哈哈。啊哈,我也在和低声誉作斗争。:)