【问题标题】:Check which specific validation failed for a model - ActiveModel Validation检查模型的哪个特定验证失败 - ActiveModel Validation
【发布时间】: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


    【解决方案1】:

    你不能用“礼物”吗?方法来测试它是否存在。

    user.email.present?
    

    然后使用“有效?”方法来测试其他验证。

    user.email.valid?
    

    否则,您可以在模型中编写一个方法来进行该测试。比如:

    def is_email_blank?
      self.email.blank?
    end
    

    然后像这样做你的逻辑:

    if user.is_email_blank?
      [logic]
    else
      [logic]
    end
    

    祝你好运。

    【讨论】:

    • 感谢您的帮助,劳伦斯。
    • 你帮我找到了解决方案。正如您所建议的,我在模型中添加了一个方法:def good_email_format?如果 !@attributes[:email].present? return false elsif @attributes[:email].present? && !@attributes[:email].valid?返回 false 否则返回 true 结束
    • 很高兴它有帮助。并感谢您接受我的回答。它给了我足够的声誉,现在可以发布图片了,哈哈。
    • 啊哈,我也在为声誉低下而苦苦挣扎。 :)
    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2015-01-13
    • 2011-10-06
    相关资源
    最近更新 更多