2010-12-13 1 views
4

Das Play-Framework hat eine Funktion in der Ansicht, um eine SEO-freundliche URL über die slugify()-Funktion zu erstellen. Es scheint keine "Unlugify" -Funktion zu geben, also wie suchen Sie nach Modellen aus dem Slugified-Parameter?Spielen! Framework: Wie suche ich ein Objekt von einer "slugify()" URL?

Wenn ich zum Beispiel ein Blog-Modell habe, dessen Titeleigenschaft auf "Hallo Welt" gesetzt ist, würde slugify "Hallo-Welt" erzeugen. Wenn ich dann eine Abfrage Blog.find("byTitle", title) durchführe, in der Titel der Slugified-Titel ist, gibt es keine Ergebnisse zurück. Wie können Sie ein Modell mithilfe des bereitgestellten Slugs suchen?

Antwort

14

Es scheint keine Methode zu sein, aber ich bin nicht überrascht. Slugify entfernt Zeichen aus dem String und unslugify würde nicht wissen, wo es in zurück zu setzen.

Zum Beispiel, wenn Sie unter der URL suchen diese Frage, es ist

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

Es den Ausruf entfernt hat (!), Klammern und die Zitate aus dem Titel dieser Frage. Wie würde eine Unlugify-Methode wissen, wo und wie diese Zeichen wieder eingefügt werden?

Die Methode, die Sie verwenden möchten, ist auch die ID, wie die Stackoverflow-URL hat.

Wenn Sie das gleiche Format wie die Stackoverflow URL nehmen wollte, würde Ihr Weg sein

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

Dann in Ihrer Aktion, würden Sie den Titel ignorieren und einfach tun Blog.findById(id);

Sie dann eine SEO-freundliche URL sowie einen guten REST-Ansatz für den Zugriff auf den Blog-Post.

+6

Nur um zu betonen, der Slugified-Parameter existiert * ausschließlich * für Suchmaschinen. Ihre Website sollte mit oder ohne dasselbe funktionieren. –

+0

So war ich schon gegangen, danke für die Validierung meines Ansatzes! –

+0

Gibt es eine Möglichkeit, dass jemand weiß, dass die URL den Slugified-Titel automatisch enthält, oder muss das bei der Erstellung jeder URL angegeben werden? also @ {Blog.show (id, title.slugify)}. Vielen Dank. –

2

Eigentlich können Sie: Sie müssen den Slugified String in Ihre Datenbank speichern.

In Ihrem Modell:

//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; } 
    } 
} 

In Ihrem Controller:

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>"); 
} 

Bitte denken Sie daran, Routen zu definieren:

# Products 
GET  /products/        Products.index 
GET  /products/{prod_slug}     Products.show 
Verwandte Themen