2014-04-28 1 views
0

slug 매개 변수가있는 Site 모델이 있습니다. 사용자가 Site을 저장할 때마다 레일 앱에서 슬러그를 생성하고 싶지만 slug은 고유해야합니다. 고유성을 보장하기 위해 유효성을 확인했습니다.레일스는 다른 필드를 기반으로 저장하기 전에 슬러그를 생성합니다.

내가 가진 도전은 사용자가 같은 이름의 두 번째 사이트를 만들 때 동일한 슬러그가 생성된다는 것입니다. 예 name = "Helloname = "hElLo" 둘다

before_validation :create_slug 

    private 

    def create_slug 
    self.slug = self.name.parameterize 
    end 

hello 제가 동일한 슬러그와 사이트가 존재하고 부가 "-1"슬러그 각 루프는 고유 때까지 여부 체크 while 루프를 추가하는 시도 생성한다. 문제는 내가 사이트를 업데이트하면 동일한 슬러그가있는 사이트가 존재하고 슬러그가 증가하는 것을 루프에서 볼 수 있지만 이미 존재하는 사이트는 동일한 사이트였습니다. 난 당신이 두 단계로 문제를 해결할 수 있다고 생각

def create_slug 
    a = self.name.parameterize 
    while Site.where(slug:a).count > 0 do 
     a = a + "-1" 
    end 
    self.slug = a 
    end 

답변

1

:

는 여기에 사용 된 코드입니다. name 필드가 업데이트 될 때 조건부 하나

before_validation :create_slug if: :name_changed? 

에 그런 식으로 당신의 before_filter을 수정하여 항상 슬러그를 확인

우선 피하기는 콜백 만 실행됩니다.

두 번째로 name 유효성 검사기를 수정하여 레일스가 제공하는 기본 고유성 검사기를 사용하는 대신 정확한 내용을 확인하거나 유효성 검사를 slug 필드로 이동하십시오.

+0

감사합니다 - 사용자가 "Hello"에서 "HeLLo"또는 그와 비슷한 이름을 변경하면 유일한 문제가 발생합니다. 이름은 바뀌었지만 슬러그는 그렇지 않았습니다. 나는 이름보다는 슬러그를 검증해야 할 것이라고 생각합니다. – Jack

+0

나는 그것이 더 현명 할 것이라고 생각한다. – xlembouras

0

이 당신이 찾고있는 해답이 될 않을 수도 있지만 좋은 전략이 영구 링크에 날짜를 넣어하는 것입니다, 그래서

/post/:year/:month/:day/:slug

이은을 피하기 위해 도움이 될 뭔가 같은 것 URL 중복