如果找不到所需主题,如何在代码段中触发404?

时间:2013-06-25 07:13:18

标签: http-status-code-404 lift code-snippets

这是一个电梯webapp,访客可以通过这样的网址查看主题:

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中,一个在片段中。)

有没有解决方案?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以使用?idSitemap来完成您要执行的操作,而不是使用查询参数Menu.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有字段idname来说明它可能如何工作,但这显然会发生变化。我还假设Topic.find返回Box

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

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

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

throw new ResponseShortcutException(() => new NotFoundResponse("Not Found"))