4

play フレームワークには、関数を介して SEO に適した URL を作成するビューの関数がありslugify()ます。「unslugify」機能はないようですが、slug化されたパラメータからどのようにモデルを検索しますか?

たとえば、title プロパティが「hello world」に設定されたブログ モデルがある場合、slugify は「hello-world」を生成します。次に、タイトルがスラッグ化されたタイトルであるクエリを実行するBlog.find("byTitle", title)と、結果は返されません。提供されたスラッグを使用してモデルを検索するにはどうすればよいですか?

4

2 に答える 2

14

メソッドはないようですが、私は驚かない。Slugify は文字列から文字を削除しますが、unslugify はそれをどこに戻せばよいかわかりません。

たとえば、この質問の URL を見ると、

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

この質問のタイトルから感嘆符 (!)、括弧、および引用符を削除しました。unslugify メソッドは、これらの文字を元に戻す方法と場所をどのように知るのでしょうか?

必要なアプローチは、stackoverflow URL と同様に、ID も含めることです。

stackoverflow URL と同じ形式を使用する場合、ルートは次のようになります。

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

次に、アクションでは、タイトルを無視して、単にBlog.findById(id);

これで、SEO に適した URL が得られ、さらに優れた REST アプローチを使用してブログ投稿にアクセスできます。

于 2010-12-13T22:15:36.443 に答える
2

実際にはできます。スラグ化された文字列をデータベースに保存する必要があります。

あなたのモデルで:

//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
于 2011-12-20T00:49:49.017 に答える