玩!框架:如何从“slugify()”URL查找项目?

时间:2010-12-13 21:24:19

标签: playframework

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

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

2 个答案:

答案 0 :(得分:14)

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

例如,如果您查看此问题的网址,则为

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

它删除了感叹号(!),括号和此问题标题中的引号。 unlugify方法如何知道如何以及将这些字符放回去的位置?

您要采取的方法是包括ID,就像stackoverflow URL一样。

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

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

然后在您的操作中,您将忽略标题,只需执行Blog.findById(id);

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

答案 1 :(得分: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