2010-12-13 3 views
4

재생 프레임 워크에는보기에서 slugify() 기능을 통해 SEO 친화적 인 URL을 만드는 기능이 있습니다. "unslugify"함수가없는 것처럼 보이므로, slugified 매개 변수에서 모델을 어떻게 검색합니까?재생! 프레임 워크 : "slugify()"URL에서 항목을 찾으려면 어떻게합니까?

예를 들어 제목 속성이 "hello world"로 설정된 블로그 모델이있는 경우 slugify는 "hello-world"를 생성합니다. 그런 다음 질문을 수행하는 경우 Blog.find("byTitle", title) 여기서 title은 slugified 제목이고 아무런 결과도 반환하지 않습니다. 제공된 슬러그를 사용하여 모델을 어떻게 찾을 수 있습니까?

답변

14

방법이있는 것처럼 보이지 않지만 놀랄 일이 아닙니다. Slugify 문자열에서 문자를 제거하고 unslugify 어디에서 그것을 다시 넣어하는 방법을 알고하지 않을 것입니다. 예를 들어

이 질문에 대한 URL 보면, 그것은 그것은 느낌표를 제거했습니다

stackoverflow.com/questions/4433620/play-framework-how-do-i-lookup-an-item-from-a-slugify-url 

입니다 (!), 괄호 및이 질문 제목의 따옴표. 어떻게 sllugify 방법은 그 문자를 다시 넣을 방법과 장소를 알 수 있습니까?

취할 접근법은 stackoverflow URL과 마찬가지로 ID도 포함하는 것입니다. 당신이 유래 URL과 같은 형식을하고 싶었다면

, 경로는

액션에서 다음
GET /questions/{id}/{title}    Question.show() 

, 당신은 제목을 무시하는 것, 그리고 단순히 그런 다음 Blog.findById(id);

를 할 것 SEO 친화적 인 URL, 블로그 게시물에 액세스하는 데 좋은 REST 접근 방식을 사용하십시오.

+6

강조하기 위해, slugified 매개 변수는 검색 엔진에만 존재합니다. 귀하의 사이트는 동일하거나 혼동없이 작동해야합니다. –

+0

이것은 내가 이미 접근 한 방식이었습니다. 접근 방식을 확인해 주셔서 감사합니다! –

+0

URL에 슬러킹 된 제목이 자동으로 포함되도록하는 방법은 없나요? 아니면 각 URL이 생성 될 때 지정해야합니까? 즉 {Blog.show (id, title.slugify)}. 감사. –

2

실제로 할 수있는 작업 : slugified 문자열을 db에 저장해야합니다. 당신의 모델에서

:

당신의 컨트롤러에서
//import ... ; 

import play.templates.JavaExtensions; 

@Entity 
public class Product extends Model{ 
    public String name; 
    public String slug; 

    @PrePersist 
    @PreUpdate 
    void pre_update(){ 
     this.slug = JavaExtensions.slugify(this.name); 

     // Prevent duplicates 
     Long dup_slug = Product.count("bySlug", this.slug); 
     if(dup_slug>0){ this.slug += "_"+this.id; } 
    } 
} 

:

public static void show(String prod_slug) { 
    Product prod = Product.find("bySlug", prod_slug).first(); 
    notFoundIfNull(prod); 
    renderText("Product: <a href='/products/"+prod.slug+"'>"+prod.name+"</a>"); 
} 

것은 당신의 경로를 정의하는 것을 기억하십시오 :

# Products 
GET  /products/        Products.index 
GET  /products/{prod_slug}     Products.show 
관련 문제