在ActiveRecord中验证网址的最佳方法是什么?
我考虑过应用这些要求:
我的惶恐来自第二个要求。代码必须验证地址,从而花费时间并使提交表单需要很长时间才能验证。这个要求合理吗?
欢迎提出意见和建议。
答案 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