如何检查 URL 是否与 Lift 中的现有 Loc 匹配?
How can I check if a URL matches an existing Loc in Lift?
我正在尝试在我的应用程序中构建一些相当复杂的面包屑功能,其中多个页面可能 link 到一个详细信息页面,但我只想在通过具体路线。
在我的用例中,用户会转到搜索页面并输入搜索字符串。该表单在当前页面上使用 "get" 方法为用户呈现包含某些项目的搜索结果。用户选择一个项目以进入其详细信息页面。在详情页查看S.referer
,发现是一个字符串:http://localhost:8080/myapp/search?q=Query+Data+Here
.
有什么方法可以获取 Search
页面 Loc 并测试上面的字符串 URL 是否匹配它?现在我正在通过简单地 运行 a contains 参考字符串并根据结果执行此检查。
这是我当前的实现:
/**
* List of valid pages to use for generating the page breadcrumbs.
*/
private def validParentLocations = Seq("Search", "Browse")
/**
* If the referer to this page is one of the valid parent locations,
* then find the a tag with the "prev" id and route it to the referer.
*
* If the referer to this page is not in the list or empty, do not
* display the breadcrumb component.
*/
def breadcrumb = {
S.referer match {
case Full(reference) =>
validParentLocations.find(s => reference.contains(s"myapp/${s.toLowerCase}")).map(parent =>
"#prev *" #> parent &
"#prev [href]" #> reference
).getOrElse(ClearNodes)
case _ => ClearNodes
}
}
如您所见,我希望将 validParentLocations
替换为 Loc,而不是脆弱的字符串,如果我修改 Boot
中的页面定义,它可能会损坏。有没有什么方法可以基本上说 myPageLoc.checkIfUrlMatches(string: String): Boolean
或我缺少的匹配模式?是否有更优雅的方式来使用 Lift 中的现有功能或其他方式来执行此操作?
在玩弄了一段时间之后,我找到了一种方法 "register" 通过使用共享的 LocGroup 名称,Loc 成为详细信息页面的有效引荐来源网址。现在我可以获取该页面的所有有效推荐位置并调用它们的默认 href 函数来测试它们是否匹配 - 仍然觉得可能有更好的方法......任何以任何身份匹配我的推荐 link 都可以放行。
代码如下:
Boot.scala:
<...>
Menu.i("Search") / "myApp" / "search" >> LocGroup("main", Detail.referralKey),
Menu.i("Browse") / "myApp" / "browse" >> LocGroup("main", Detail.referralKey),
Detail.getMenu,
<...>
Detail.scala:
<...>
def referralKey = "detail-page-parent"
/**
* Sequence of valid Locs to use for generating the page breadcrumbs.
*/
private def validParentLocations = LiftRules.siteMap.map(site => site.locForGroup(locGroupNameForBreadcrumbParents)) openOr Seq()
/**
* If the referer to this page is one of the valid parent locations,
* then find the a tag with the "prev" id and route it to the referer.
*
* If the referer to this page is not in the list or empty, do not
* display the breadcrumb component.
*/
def breadcrumb = {
S.referer match {
case Full(reference) =>
validParentLocations.find(loc => reference.contains(loc.calcDefaultHref)).map(parent =>
"#prev *" #> parent.name &
"#prev [href]" #> reference
).getOrElse(ClearNodes)
case _ => ClearNodes
}
}
<...>
我正在尝试在我的应用程序中构建一些相当复杂的面包屑功能,其中多个页面可能 link 到一个详细信息页面,但我只想在通过具体路线。
在我的用例中,用户会转到搜索页面并输入搜索字符串。该表单在当前页面上使用 "get" 方法为用户呈现包含某些项目的搜索结果。用户选择一个项目以进入其详细信息页面。在详情页查看S.referer
,发现是一个字符串:http://localhost:8080/myapp/search?q=Query+Data+Here
.
有什么方法可以获取 Search
页面 Loc 并测试上面的字符串 URL 是否匹配它?现在我正在通过简单地 运行 a contains 参考字符串并根据结果执行此检查。
这是我当前的实现:
/**
* List of valid pages to use for generating the page breadcrumbs.
*/
private def validParentLocations = Seq("Search", "Browse")
/**
* If the referer to this page is one of the valid parent locations,
* then find the a tag with the "prev" id and route it to the referer.
*
* If the referer to this page is not in the list or empty, do not
* display the breadcrumb component.
*/
def breadcrumb = {
S.referer match {
case Full(reference) =>
validParentLocations.find(s => reference.contains(s"myapp/${s.toLowerCase}")).map(parent =>
"#prev *" #> parent &
"#prev [href]" #> reference
).getOrElse(ClearNodes)
case _ => ClearNodes
}
}
如您所见,我希望将 validParentLocations
替换为 Loc,而不是脆弱的字符串,如果我修改 Boot
中的页面定义,它可能会损坏。有没有什么方法可以基本上说 myPageLoc.checkIfUrlMatches(string: String): Boolean
或我缺少的匹配模式?是否有更优雅的方式来使用 Lift 中的现有功能或其他方式来执行此操作?
在玩弄了一段时间之后,我找到了一种方法 "register" 通过使用共享的 LocGroup 名称,Loc 成为详细信息页面的有效引荐来源网址。现在我可以获取该页面的所有有效推荐位置并调用它们的默认 href 函数来测试它们是否匹配 - 仍然觉得可能有更好的方法......任何以任何身份匹配我的推荐 link 都可以放行。
代码如下:
Boot.scala:
<...>
Menu.i("Search") / "myApp" / "search" >> LocGroup("main", Detail.referralKey),
Menu.i("Browse") / "myApp" / "browse" >> LocGroup("main", Detail.referralKey),
Detail.getMenu,
<...>
Detail.scala:
<...>
def referralKey = "detail-page-parent"
/**
* Sequence of valid Locs to use for generating the page breadcrumbs.
*/
private def validParentLocations = LiftRules.siteMap.map(site => site.locForGroup(locGroupNameForBreadcrumbParents)) openOr Seq()
/**
* If the referer to this page is one of the valid parent locations,
* then find the a tag with the "prev" id and route it to the referer.
*
* If the referer to this page is not in the list or empty, do not
* display the breadcrumb component.
*/
def breadcrumb = {
S.referer match {
case Full(reference) =>
validParentLocations.find(loc => reference.contains(loc.calcDefaultHref)).map(parent =>
"#prev *" #> parent.name &
"#prev [href]" #> reference
).getOrElse(ClearNodes)
case _ => ClearNodes
}
}
<...>