如何检查 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
  }
}
<...>