4

播放框架在视图中有一个功能,可以通过该功能创建一个 SEO 友好的 URL slugify()。似乎没有“unslugify”功能,那么如何从 slugified 参数中查找模型?

例如,如果我有一个博客模型,其标题属性设置为“hello world”,slugify 将产生“hello-world”。如果我随后执行Blog.find("byTitle", title)标题为 slugified 标题的查询,它将不返回任何结果。如何使用提供的 slug 查找模型?

4

2 回答 2

14

似乎没有方法,但我并不感到惊讶。Slugify 从字符串中删除字符,而 unslugify 不知道将其放回何处。

例如,如果您查看此问题的 URL,它是

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

它已删除此问题标题中的感叹号 (!)、括号和引号。unslugify 方法如何知道如何以及在何处将这些字符放回原处?

您要采用的方法是也包含 ID,就像 stackoverflow URL 一样。

如果您想采用与 stackoverflow URL 相同的格式,您的路线将是

GET /questions/{id}/{title}              Question.show()

然后在你的行动中,你会忽略标题,只是做Blog.findById(id);

然后,您将拥有一个 SEO 友好的 URL,并使用良好的 REST 方法来访问博客文章。

于 2010-12-13T22:15:36.443 回答
2

实际上你可以:你需要将 slugified 字符串存储到你的数据库中。

在您的模型中:

//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
于 2011-12-20T00:49:49.017 回答