【问题标题】:rails 4 validation issuerails 4验证问题
【发布时间】:2014-04-30 17:35:10
【问题描述】:

我在 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

线。我不明白这一点,因为我在尝试创建 uri 字符串之前检查了 domain 的值是否为零。

这是在 Ruby 2.0.0 下运行的——我相信这段代码在 Ruby 1.9.3 下可以正常工作——是这个原因吗?还是我遗漏了一些明显的东西?

谢谢!

【问题讨论】:

  • Rails.logger.debug domain.class 打印什么?
  • @UriAgassi-- Rails.logger.debug domain.class prints String

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


【解决方案1】:

您可以尝试使用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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      我发现nil? 返回 false,empty? 工作正常。因此,如果您只检查字符串是否为空,而不是使用检查 nil,它会按预期工作。奇怪,但空白表单值仍然计算为字符串,而不是 null / nil 值。

      if domain.empty?
        errors.add(:domain, "Domain is required.")
        return
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多