Parameters 将参数化URL添加到提升应用程序

Parameters 将参数化URL添加到提升应用程序,parameters,url-routing,lift,Parameters,Url Routing,Lift,我需要参数化URL的最基本情况:具有类似于localhost:8080/editstuck/4的URL,这将生成一个用于编辑ID等于4的研究的表单 但是,即使在浏览了电梯维基和我的书之后,我也没有找到如何去做。到目前为止,我拥有的是一个HTML页面editStudy.HTML,它将来将包含编辑表单,一个类StudyDisplayer,它应该呈现表单,一个对象StudyDisplayer,它定义了类似于菜单的东西(它是一个参数,不管是什么),以及站点地图中的一个条目 当转到localhost:80

我需要参数化URL的最基本情况:具有类似于
localhost:8080/editstuck/4
的URL,这将生成一个用于编辑ID等于4的研究的表单

但是,即使在浏览了电梯维基和我的书之后,我也没有找到如何去做。到目前为止,我拥有的是一个HTML页面
editStudy.HTML
,它将来将包含编辑表单,一个类
StudyDisplayer
,它应该呈现表单,一个对象
StudyDisplayer
,它定义了类似于菜单的东西(它是一个参数,不管是什么),以及站点地图中的一个条目

当转到
localhost:8080/editStudy/4

在此服务器上找不到请求的URL/editStudy/4

尽管站点地图中引用了该位置。我做错了什么?访问URL时,我在哪里告诉Lift显示editStudy页面


editStudy.html:

<html>
  <head>
    <title></title>
    <meta content="">
        <link rel="stylesheet" type="text/css" href="litsuche.css">
  </head>
  <body>
    <nav>
      <span data-lift="Menu.builder"></span>
    </nav>
    <div data-lift="StudyDisplayer">
        <h1>Editing the study <span id="reference"></span></h1>
    </div>
  </body>
</html>

Lift有两种用于添加参数的机制。和。它们之间的区别在于所需的参数数量

Menu.param采用单个参数,因此在您的情况下,您有:

Menu.param[Study](
    "EditStudy", 
    "editStudy", 
    Study.findByIdAsString(_),
    _.id.toString()
) / "editStudy" 
这是最简单的机制,因为它查找名为“editStudy.html”的模板,并获取它假定存在的一个参数,并将其传递给函数:
Study.findidaString
。如果函数返回
Full
,则未固定的值将传递给代码段以进行呈现。如果函数返回
Empty
Lift,默认情况下将返回404

Params是一个大致相同的概念,但它允许您指定多个参数和/或匹配多个URL。例如,我们可以将您的示例改编为:

Menu.params[Study]("EditStudy", "EditStudy", {
    case s :: Nil => Study.findByIdAsString(s)
    case _ => Empty
}, {
    case g = > g.id :: Nil
}) / "editStudy" / *
您会注意到,在“editStudy”之后有一个通配符匹配。原因是没有对参数数量的假设,因此,如果要查找单个参数或将每个子路径与“editStudy”匹配,则需要指定它要查找的内容。对于要查找的每个模式,只需向匹配项添加一个新的case语句

如果要返回多个项目,甚至可以使用元组键入
Menu.params
,例如:

Menu.param[(Study, Grade)]("EditStudy", "EditStudy", {
    case s :: g :: Nil => (Study.findByIdAsString(s), Grade.findByIdAsString(g))
    case _ => Empty
}, {
    case (g, s) => g.id :: s.id :: Nil
}) / "editStudy" / **
这将在url中查找两个id参数,如:“/editStudy/1234/5678”


还要注意的是,在处理模式匹配时,使用提取器来检索值通常更干净。如果你需要的话,我会提供更多的信息。

除了常见的信息来源(Wiki,Simply Lift),我还发现了。它表示Link参数只是一个Link。但由于某些原因,它在这里似乎不起作用。您能否尝试将路径简单地指定为
/“editstumby”
(不带尾随
/*
)?@jcern当我删除尾随/*,我会在调用menu.builder的其他页面上得到“未定义导航”而不是导航菜单,调用/editStudy/4时也出现了同样的错误。我在
Study.findByIdAsString
中添加了一些日志记录。解析器需要返回完整的[Study]以匹配URL,否则将得到404。添加一些日志会让您知道1。解析器是否被调用,以及2。它返回的是空的还是失败的,而不是您所期望的?@jcern我意识到我也将该文件添加为一个简单的菜单项,以确保它没有问题。一旦我删除了简单项和尾部的
/*
,它就工作了。所以请写一个完整的答案,这样我就可以接受了。如果您还可以说一些关于Lift如何匹配URL的内容,或者在哪里阅读它的内容,那就太好了。我使用的是简单的Lift,第6.3节的字面意思是“最后,URL由/“item”/*定义,这与它的外观非常相似。它将匹配表单/item/xxx和xxx的传入请求”。
Menu.params[Study]("EditStudy", "EditStudy", {
    case s :: Nil => Study.findByIdAsString(s)
    case _ => Empty
}, {
    case g = > g.id :: Nil
}) / "editStudy" / *
Menu.param[(Study, Grade)]("EditStudy", "EditStudy", {
    case s :: g :: Nil => (Study.findByIdAsString(s), Grade.findByIdAsString(g))
    case _ => Empty
}, {
    case (g, s) => g.id :: s.id :: Nil
}) / "editStudy" / **