我在Rails 4应用程序中使用自定义验证。它只是一个用户表单,应该提交用户的域名,然后对其进行验证以确保该站点存在。
验证看起来像这样:
validates :first_name, :last_name, :domain, presence: true
validate :domain_check
如果域保留为空,而不是从第一次presence
验证返回验证错误,则会运行:domain_check
函数。当第一次验证失败时,它似乎应立即返回?
其次,当它执行:domain_check
功能时,我不确定如何检查domain
值 - 现在我这样做:
def domain_check
Rails.logger.debug '###############'
Rails.logger.debug domain.inspect # prints ""
Rails.logger.debug domain # prints nothing
Rails.logger.debug domain.nil? # prints nothing
Rails.logger.debug '###############'
if domain.nil?
errors.add(:domain, "Domain is required.")
return
end
if domain.strip.starts_with?('http://')
domain.gsub 'http://', ''
elsif domain.strip.starts_with?('https://')
domain.gsub 'https://', ''
end
uri = 'http://'+domain
response = open(uri).read
# more stuff here
提交的表单会在
上返回undefined method "+" for nil:NilClass
uri = 'http://'+domain
线。我不明白这一点,因为我在尝试创建domain
字符串之前检查了uri
的值是否为nil。
这是在Ruby 2.0.0下运行 - 我相信这段代码在Ruby 1.9.3下运行正常 - 原因是什么?或者我错过了一些明显的东西?
谢谢!
答案 0 :(得分:2)
您可以尝试使用addressable
gem:
require 'addressable/uri'
def domain_check
address = Addressable::URI.parse(domain)
if address.nil? || address.host.blank?
errors.add(:domain, "Domain is required.")
return
end
address.scheme = 'https'
address.path = nil
uri = address.to_s
response = open(uri).read
end
答案 1 :(得分:0)
require 'net/http'
def domain_check
unless self.domain
errors.add(:domain, "Domain is required")
return
else
case Net::HTTP.get_response(URI.parse(self.domain))
when Net::HTTPSuccess
return true
else
errors.add(:domain, 'Not a valid domain')
end
end
答案 2 :(得分:0)
我发现虽然nil?
返回false,但empty?
正常工作。因此,如果您只检查字符串是否为空,则不使用nil
检查,而是按预期工作。奇怪,但空白表单值仍然计算为字符串,而不是null / nil
值。
if domain.empty?
errors.add(:domain, "Domain is required.")
return
end