0

这是一个lift webapp,访问者可以通过这样的url查看主题:

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

有一个topic.html和一个TopicSnippet。我在片段中得到了 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 中检查它,但这意味着我必须为单个主题查询 db 两次——一次在 SiteMap 中,一次在片段中)。

有什么解决办法吗?

4

2 回答 2

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 回答
1

?id您可以使用SitemapandMenu.param来完成您想要做的事情,而不是使用查询参数。

此外:Boot.scala_Sitemap

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

在 Snippet 中,将构造函数更改为:

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

我做了上面的假设,它Topic有字段idname说明它是如何工作的,但这显然可以改变。我还假设Topic.find返回一个Box.

上面发生的情况是,您将访问 url:/topic/12332其中 12332 是任何 id,并且该参数将传递给您使用定义的查找Menu.param。然后,查找到的值将TopicSnippet通过构造函数传递给。如果未找到主题(查找返回 Empty),则会向浏览器返回 404。这>> Title() LocParam不是必需的,但允许您使用主题名称动态设置页面标题。

从用户体验来看,这也更有意义,因为404如果找不到完整的 url,则会返回 。使用查询参数,/topic实际上会找到页面,只是查找没有。

如果您需要使用查询参数方法,您可以尝试抛出这样的东西,这可能对您有用:

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