rails 4验证问题

时间:2014-04-30 17:35:10

标签: ruby-on-rails ruby ruby-on-rails-4

我在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下运行正常 - 原因是什么?或者我错过了一些明显的东西?

谢谢!

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