[英]How to de-slugify a request URL before the action is executed in Play! Framework
[英]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.