0

これはリフト Web アプリで、訪問者は次の URL でトピックを表示できます。

http://test.com/topic?id=12332

それには atopic.htmlと aTopicSnippetがあります。スニペットでIDを取得します:

class TopicSnippet {
    val topic = S.param("id") match {
       case Full(id) => Topic.find(id) match {
          case Full(topic) => topic
          case _ => trigger 404, but how to ???
       }
       case _ => trigger 404, but how to ???
    }
}

スニペットで 404 をトリガーしたいことがわかりますが、その方法がわかりません。SiteMap で確認する必要があると書かれている場所を見つけましたが、これは、1 つのトピックについて db に 2 回クエリを実行する必要があることを意味します (SiteMap で 1 回、スニペットで 1 回)。

これに対する解決策はありますか?

4

2 に答える 2

1

クエリ パラメータを使用する代わりに、andを?id使用して、目的を達成できます。SitemapMenu.param

Boot.scala加えてSitemap

Menu.param[Topic]("Topic", "Topic", {
  id => Topic.find(id)
}, { _.id } ) / "topic" >> Title(t => t.name)

スニペットで、コンストラクターを次のように変更します。

class TopicSnippet(Topic topic) {
  // access topic as you need to
}

Topicフィールドがidあり、それがどのように機能するかを説明するために上記の仮定を行いましたnameが、明らかに変わる可能性があります。Topic.findまた、 を返すと仮定しますBox

上記で何が起こるかというと、URL にアクセスすることになります。/topic/12332ここで、12332 は任意の ID であり、そのパラメーターは で定義したルックアップに渡されますMenu.paramTopicSnippet検索された値は、コンストラクターを介して渡されます。トピックが見つからない (ルックアップが空を返す) 場合、404 がブラウザーに返されます。これ>> Title() LocParamは必須ではありませんが、トピックの名前を使用してページのタイトルを動的に設定できます。

404完全な URL が見つからない場合に が返されるため、ユーザー エクスペリエンスからすると、これはもう少し理にかなっています。query パラメーターを使用すると、ページ/topicは実際に見つかりますが、そうでないのはルックアップだけです。

query param アプローチを使用する必要がある場合は、次のようなものをスローしてみてください。

throw new ResponseShortcutException(() => new NotFoundResponse("Not Found")) 
于 2013-06-25T12:58:18.933 に答える
1

あなたRequestVarの問題を解決しますか?

以下の方法で使用できます。Boot.scala:

    yourMenu >> If({ () =>
        val databaseInfo = "123" // work with the DB here
        if (good) {
            YourRequestVar.set(databaseInfo)
            true
        } else {
            false
        }
    }, "error")

の次のようなものYourRequestVar.scala:

    object YourRequestVar extends RequestVar[String]("")

テンプレート:

        val databaseInfo: String = YourRequestVar.is
于 2013-06-25T09:04:31.963 に答える