2013-11-21 2 views
2

레일스 모델에서 고유 한 http 링크가 포함 된 필드를 만들어야합니다. 그뿐만 아니라, 내가 좋아하는뿐만 아니라 링크 변화를 거부하고 싶습니다 :레일스를 사용하여 어떻게 복잡한 고유 항목을 만들 수 있습니까?

  • 내가 HTTP S I 매개 변수와 링크를 삽입하려고하면 HTTP 주소는
  • 존재 주소를 삽입하려고하면 매개 변수가없는 다른 링크가 있거나 다른 링크가있는 경우

내 문제의 답을 나타낼 수있는 링크를 찾았지만 시간적으로 변하지 않으므로 인덱스에서 직접 수행 할 수 있기를 바랍니다 통과합니다.

In Rails, How do I validates_uniqueness_of :field with a scope of last 6 months

나는 정규 표현식과 경험을 가지고 정확한 답을 제공 할 필요가 없습니다. 나는 아무도를 찾을 couln't 같은 다른 예를 이미 참조 멋진 것

+2

당신은 링크 모델을 만드는 것을 고려할 수 있습니다, "프로토콜"(http/https), "포트"(80/43), "url", "params"와 같은 속성을 가지고 URL의 고유성을 검증합니다 (원하는 매개 변수와 프로토콜을 제외합니다) – MrYoshiji

+0

@ 요시지 씨, 재미있을 것 같습니다. 그 대답을 만들고 싶지 않니? –

+0

그냥 했어, 완벽하지는 않지만 당신에게 링크 모델의 기초를 제공합니다 – MrYoshiji

답변

2

뭔가 첫 걸음 당신에게 제공 할 수 있습니다 :

require 'uri' 

class Link < ActiveRecord::Base 
    attr_accessor :link 

    validate :check_link_integrity 
    validates :url, uniqueness: true 
    before_save :parse_link 

    def check_link_integrity 
    begin 
     URI::parse(self[:link]) 
     return true 
    rescue URI::InvalidURIError => e 
     return false 
    end 
    end 

    def parse_link 
    uri_link = URI::parse(self.attributes.delete(:link)) 
    self.url = uri_link.host + uri_link.path 
    self.protocol = uri_link.scheme 
    self.parameters = uri_link.query 
    end 

    def to_s 
    "#{protocol}://#{url}?#{parameters}" 
    end 

end 

URI 모듈 문서 : http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html

+0

감사! 나는 아직 시도하지 않았지만 아주 좋아 보인다! –

+0

지연에 대한 미안 ... 내 애플 리케이션에서 다른 문제를 해결하고 ... 나는 지난 며칠 그것을 시도하고 "self.attributes.delete (: link)"를 "self.link"로 대체하기 시작했습니다. 편집보기에는 현재 링크가 표시되지 않습니다. 내가 뭔가 잘못하고 있는거야? 유사한 문제를 해결하는 리소스는 내가 찾지 못해 도움이 될 것입니다. 감사! –

+1

나는 그것이 최선의 해결책이 아닐지라도 작동하는 것처럼 보였습니다. 나는 parse_link에 param을 포함하고, parse_link에 param을 포함하고, "uri_link = URI :: parse (param_link", 매개 변수로 params [: link] [: link]를 전달하는 컨트롤러에서 그것을 호출하고 to_s를 링크로 사용했다. –

1

당신이 할 수 있다는 URI 모듈을 사용하여 사용자 정의 유효성 검사 방법

당신이 필요로 URI = URI (your_url) 입니다 기본적으로 동일한 uri.host 및 uri.path를 가진 다른 레코드가 있는지 확인하십시오.

예, 이것은 레일 방식이 아니며 각 확인시 계산이 필요하지만 요청 사항도 간단하지 않습니다.

또 다른 방법은 데이터베이스에 hostname + path 만 저장하는 것입니다 (저장시 url에서 프로토콜과 매개 변수를 잘라내는 것을 의미). 당신이 uniqness 체크 메커니즘 내장에서 사용할 수있는이 방법이 같은

+0

고마워요! 나는 URI를 몰랐다. 절단은 위험하다고 생각합니다. 하지만 아마도이 정보를 잃어 버리는 것을 의미하지는 않습니다. –

관련 문제