最佳实践 - 验证URL Rails3

时间:2011-03-01 15:32:50

标签: ruby-on-rails-3 validation

在ActiveRecord中验证网址的最佳方法是什么?

我考虑过应用这些要求:

  1. 应该是可公开路由的网址,即 NOT 是否应位于localhost,127.0.0.1
  2. 应该是HTTP状态代码2xx,3xx(如果超过10个重定向,则遵循3xx到2xx,然后失败)
  3. 我的惶恐来自第二个要求。代码必须验证地址,从而花费时间并使提交表单需要很长时间才能验证。这个要求合理吗?

    欢迎提出意见和建议。

1 个答案:

答案 0 :(得分:1)

将其发送到Delayed Job之类的作业队列,以便在请求/响应周期之外完成,这样您就可以立即接受数据而不是阻止用户,并且在处理之后,保存记录(如果有效) ),或者如果无效则丢弃。

当然,如果你不得不丢弃它,你可能想要发布一些让用户知道出现问题的东西。由于它不在请求范围内,您可能需要在以后的页面上引起用户的注意(可能是flash消息?)或向他们发送电子邮件。

编辑:进一步说明:

我会创建一个名为unverified_url的列以及url,然后将表单设置为提交到unverified_url

require 'net/http'
require 'uri'

after_save :verify_url_later

def verify_url_later
  self.delay.verify_url
end

def verify_url
  if !unverified_url.match(/127.0.0.1|localhost/) && fetch(unverified_url)
    # all good, save to publicly-accessible url
    self.update_attributes(:url => unverified_url, :unverified_url => nil)
  else
    UserMailer.bad_url_notification(unverified_url).deliver
  end
end

def fetch(uri_str, limit = 10)
  response = Net::HTTP.get_response(URI.parse(uri_str))
  case response
    when Net::HTTPSuccess
      response
    when Net::HTTPRedirection
      fetch(response['location'], limit - 1) unless limit == 0
  else
    response.error!
  end
end