Playframework 玩框架:如何从“查询”中查找项目;slagify();网址?

Playframework 玩框架:如何从“查询”中查找项目;slagify();网址?,playframework,Playframework,play框架在视图中有一个函数,可以通过slugify()函数创建一个SEO友好的URL。似乎没有“unslugify”函数,因此如何从slugified参数查找模型 例如,如果我有一个博客模型,其标题属性设置为“hello world”,slugify将生成“hello world”。如果我随后执行一个查询Blog.find(“byTitle”,title),其中title是slagified标题,它将不会返回任何结果。如何使用提供的slug查找模型?似乎没有方法,但我并不感到惊讶。Slugi

play框架在视图中有一个函数,可以通过
slugify()
函数创建一个SEO友好的URL。似乎没有“unslugify”函数,因此如何从slugified参数查找模型


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

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

例如,如果你看这个问题的URL,它是

stackoverflow.com/questions/4433620/play-framework-how-do-i-lookup-an-item-from-a-slugify-url
它删除了这个问题标题中的感叹号(!)、括号和引号。非Lugifi方法如何知道如何以及在何处将这些字符放回

您希望采用的方法是也包括ID,就像stackoverflow URL一样

如果您希望采用与stackoverflow URL相同的格式,那么您的路由将是

GET /questions/{id}/{title}              Question.show()
然后在您的操作中,您将忽略标题,只需执行
Blog.findById(id)


然后你就有了一个SEO友好的URL,再加上使用良好的REST方法来访问博客文章。

事实上你可以:你需要将缓冲字符串存储到数据库中

在您的模型中:

在控制器中:


需要强调的是,slugified参数仅适用于搜索引擎。你的网站无论有没有它都应该是一样的。这是我已经走的路,谢谢你对我的方法的验证!是否有任何人都知道的一种方法可以让URL自动包含slagified标题,或者在生成每个URL时需要指定这种方法。i、 e.@{Blog.show(id,title.slugify)}。谢谢
//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