繁体   English   中英

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

[英]Play! Framework: How do I lookup an item from a “slugify()” url?

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

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

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

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

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

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

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

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

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

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

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

实际上你可以:你需要将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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM