这是一个电梯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中,一个在片段中。)
有没有解决方案?
答案 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)
您可以使用?id
和Sitemap
来完成您要执行的操作,而不是使用查询参数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
有字段id
和name
来说明它可能如何工作,但这显然会发生变化。我还假设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"))