2011-03-01 9 views
1

ActiveRecord에서 URL의 유효성을 검사하는 가장 좋은 방법은 무엇입니까?모범 사례 - URL 레일 유효성 검사 3

나는 이러한 요구 사항을 적용하는 방법에 대한 생각 : 127.0.0.1,

  1. 로컬 호스트에 있어야하지한다, 즉, 공개적으로 라우팅 URL되어야한다
  2. 이어야한다 HTTP 상태 코드가 2xx, 3xx의 (10 개 이상의 리디렉션이 실패 할 경우 3xx에서 2xx까지 따르십시오.)

내 불안은 두 번째 요구 사항에서 비롯됩니다. 코드는 주소를 확인해야하므로 시간이 걸리고 제출 양식을 확인하는 데 오랜 시간이 걸릴 수 있습니다. 이 요구 사항이 합리적입니까?

의견 및 제안을 환영합니다.

답변

1

Delayed Job과 같은 작업 대기열로 보내면 요청/응답주기 밖에서 수행되므로 데이터를 수락 할 수 있고 사용자를 기다리지 않고 처리 한 후 레코드를 저장하거나 (유효한 경우) 또는 유효하지 않으면 폐기하십시오.

물론 폐기해야하는 경우 사용자에게 문제가 있음을 알리는 다른 조치를 취하는 것이 좋습니다. 요청을 벗어난 것이므로 나중에 페이지에서 사용자의 관심을 끌거나 (플래시 메시지일까요?) 이메일을 보내야합니다.

편집 : 더 설명하기 :

나는 unverified_url뿐만 아니라 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 
+0

이미이 작업을 수행하는 delayed_job 설정을 unverified_url에 제출 양식을 설정합니다. 이 설정의 문제점은 일단 URL 검사가 완료되면 사이트를 업데이트하는 메커니즘을 원한다는 것입니다. 사용자가 문제가 있음을 알리기 위해 무언가를 "실행"한다고 말하면됩니다. 이미이 프로젝트를 알고 있습니까? – Ryan

+0

@ Ryan 답변을 업데이트했습니다. 바라건대 코드가 명확 해지기를 바랍니다. – Unixmonkey

+0

@Unixmonkey : 팁 : 제한 매개 변수를 fetch 메소드로 전달하고 있지만 아직 사용하지는 않았습니다. –