如何检查URL是否与Lift中的现有Loc匹配?

时间:2016-01-24 05:14:29

标签: scala lift

我正在尝试在我的应用程序中构建一些相当复杂的痕迹导航功能,其中多个页面可能链接到详细信息页面,但如果通过特定路径到达页面,我只想显示详细信息页面的痕迹。

在我的用例中,用户会转到搜索页面并输入搜索字符串。表单在当前页面上使用“get”方法来为用户呈现包含一些项目的搜索结果。用户选择一个项目以深入其详细信息页面。在详细信息页面上,我检查S.referer并发现它是一个字符串:http://localhost:8080/myapp/search?q=Query+Data+Here

我有没有办法获取Search页面Loc并测试上面的String URL是否与之匹配?现在我只是通过在引用字符串上运行一个包含并根据结果执行行为来执行此检查。

这是我目前的实施:

/**
 * 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中的现有功能是否有更优雅的方法来实现此目的?

1 个答案:

答案 0 :(得分:0)

经过一段时间的努力,我找到了一种方式来注册"通过使用共享的LocGroup名称,Loc成为Detail页面的有效引荐来源。现在我可以获取页面的所有有效推荐Loc并调用它们的默认href函数来测试它们是否匹配 - 仍然觉得可能有更好的方法......任何能够匹配我的任何推荐链接都可以通过。

以下是代码:

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
  }
}
<...>