Rails - 如何在同一列上确保两种不同的验证

时间:2017-08-23 19:13:13

标签: ruby-on-rails

在我的MyDomain表中,我想确保域名存在,同时希望通过使用某些正则表达式进行验证来确保其正确性。

class MyDomain < ApplicationRecord
  validates :domain, presence: true
  validate :domain_invalid_value

  def domain_invalid_value
    url_regex = %r{\A[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(:[0-9]{1,5})?\z}ix
    errors.add(:domain, "invalid value") if domain =~ url_regex ? true : false
  end
end

但我的domain_invalid_value并不能确保我包含validates :domain, presence: true

localhostgoogle.com都被视为有效域,在创建或更新时不应该这样。

1 个答案:

答案 0 :(得分:1)

您可以在同一行中使用format验证,即与presence一起使用;例如:

class MyDomain < ApplicationRecord
  REGEX = %r{^(http|https):\/\/|[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(:[0-9]{1,5})?(\/.*)?$}ix

  validates :domain, presence: true, format: { with: REGEX, message: "invalid value" }
end

您可以参考rails guides获取所有可用验证助手的列表。