播放框架在视图中具有通过slugify()
功能创建SEO友好URL的功能。似乎没有“unslugify”函数,那么如何从slugified参数中查找模型?
例如,如果我有一个标题属性设置为“hello world”的Blog模型,则slugify会产生“hello-world”。如果我然后执行查询Blog.find("byTitle", title)
其中title是slugified标题,它将不返回任何结果。如何使用提供的slug查找模型?
答案 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