播放框架在视图中有一个功能,可以通过该功能创建一个 SEO 友好的 URL slugify()
。似乎没有“unslugify”功能,那么如何从 slugified 参数中查找模型?
例如,如果我有一个博客模型,其标题属性设置为“hello world”,slugify 将产生“hello-world”。如果我随后执行Blog.find("byTitle", title)
标题为 slugified 标题的查询,它将不返回任何结果。如何使用提供的 slug 查找模型?
播放框架在视图中有一个功能,可以通过该功能创建一个 SEO 友好的 URL slugify()
。似乎没有“unslugify”功能,那么如何从 slugified 参数中查找模型?
例如,如果我有一个博客模型,其标题属性设置为“hello world”,slugify 将产生“hello-world”。如果我随后执行Blog.find("byTitle", title)
标题为 slugified 标题的查询,它将不返回任何结果。如何使用提供的 slug 查找模型?
似乎没有方法,但我并不感到惊讶。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 方法来访问博客文章。
实际上你可以:你需要将 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