Web applications 为什么';即使在参考了站点地图中的链接后,您是否仍无法重新编写请求工作?

Web applications 为什么';即使在参考了站点地图中的链接后,您是否仍无法重新编写请求工作?,web-applications,scala,lift,Web Applications,Scala,Lift,我在Boot.Boot()中重写了以下内容。这是基于Lift Wiki部分中的说明 LiftRules.statefulRewrite.prepend(NamedPF("CreateAndEditRewrite") { case RewriteRequest( ParsePath("models" :: "createEdit" :: state :: Nil, _, _,_), _, _) => { Console.println("Rewriting p

我在Boot.Boot()中重写了以下内容。这是基于Lift Wiki部分中的说明

LiftRules.statefulRewrite.prepend(NamedPF("CreateAndEditRewrite") {
  case RewriteRequest(
        ParsePath("models" :: "createEdit" :: state :: Nil, _, _,_), _, _) => {
      Console.println("Rewriting path: models/createEdit/Create to createEdit.html")
      val rewriteResp = RewriteResponse(
        "models/createEdit" :: Nil, "html" // Use webapp/models/creteEdit.html
      )
      Console.println("Response refers to URL " + rewriteResp.path + " with parameters " + rewriteResp.params.toList.map(x => "" + x.key + "=" + x.value + ", "))
      rewriteResp

  }
})
为确保所有内容都可访问,请确保SiteMap允许访问“models/createEdit/create”和“models/createEdit”,并显示以下行

val entries =
     Menu(Loc("models", List(""), "Models"),
         Menu(Loc("createEditM", List("models","createEdit","Create"), "[NEW]Create Model", loggedIn)),
         Menu(Loc("createEditMXX", List("models","createEdit"), "[NEW]Create Model", loggedIn)) ) ::
     User.sitemap

// Build SiteMap
LiftRules.setSiteMap(SiteMap(entries:_*))
LiftRules.passNotFoundToChain = true //if a URL isn't found pass responsability to the container
然而,第二个菜单选项在第一个菜单选项发出“HTTP错误404”时起作用 在容器级别访问/models/createEdit/Create”时出现问题

控制台上会出现以下
println

Rewriting path: models/createEdit/Create to createEdit.html
Response refers to URL ParsePath(List(models/createEdit),html,true,false) with parameters List()
INFO - Service request (GET) /models/createEdit/Create returned 0, took 11 Milliseconds
这意味着重写被触发了

我使用的是Lift 2.4-M3和Scala 2.9.0-1

有人知道问题出在哪里吗

谢谢


编辑:更改了代码示例并添加了控制台输出,以使发生的事情更加清晰。

为了解决rwrite问题,我最终删除了重写规则,并使用以下代码实现了自定义Loc对象

package pt.cnbc.wikimodels.client

package object sitemapTweaks {
  import net.liftweb.common.Full
  import net.liftweb.http.{RewriteResponse, ParsePath, RewriteRequest}
  import net.liftweb.sitemap.Loc
  import net.liftweb.common.Box
  import net.liftweb.sitemap.Loc.{
  Link, LinkText, LocParam, Hidden
  }
  import net.liftweb.sitemap.Loc.If._
  import pt.cnbc.wikimodels.snippet.User
  import net.liftweb.sitemap.Loc._

  // verification if the user is logged
  val loggedIn = If(() => User.loggedIn_?, "You must be logged in.")

  object ModelPageLoc extends Loc[ModelPageState] {
    var state:ModelPageState = defaultValue.openTheBox
    def name: String = "CreateEDitWithState"

    def link = new Link[ModelPageState]("models" :: "createEdit" :: "Create" :: Nil)

    def text = "Model handling" + defaultValue

    def params: List[LocParam[ModelPageState]] = List(loggedIn)

    override def rewrite = Full({
      case RewriteRequest(ParsePath(List("models", "createEdit", _state), _, _, _), _, _) => {
        _state match {
          case "Create" => {
            state = Create
            (RewriteResponse(List("models", "createEdit")), Create)
          }
          case _ => {
            state = Edit
            (RewriteResponse(List("models", "createEdit")), Edit)
          }
        }
      }
    })
    def defaultValue: Box[ModelPageState] = Full(Create)
  }

  sealed abstract class ModelPageState

  case object Create extends ModelPageState

  case object Edit extends ModelPageState
}
实现此对象后,我只需添加一个站点地图引用:

val entries =
     Menu(Loc("models", List(""), "Models"),
         Menu(Loc("createEditMXX", List("models","createEdit"), "[NEW]Create Model", loggedIn)),
         Menu(ModelPageLoc), //This line calls the customized Loc object
     User.sitemap

// Build SiteMap
LiftRules.setSiteMap(SiteMap(entries:_*))
LiftRules.passNotFoundToChain = true //if a URL isn't found pass responsability to the container

完成了

首先,不要使用重写内容。这是低水平的,通常是不必要的


如果需要参数化菜单项,请使用Menu.param。请参见

注意,第一个菜单(“createEditM”)从未被访问,因为所有请求/模型/createEdit/?被重定向到/型号/createEdit@coubeatczech-界面中出现“createEditM”菜单,我可以点击它。因为点击会产生一个新的请求,所以重新站点会跳转到404。我知道会触发重写,因为控制台中会打印“重写路径:models/createEdit/Create to createEdit.html”。找不到的是models/createEdit.html代码段:(也许我应该用这些额外的细节来编辑我的问题。我做了一个新的编辑来显示重写被触发了,甚至创建了一个应该包含models/createEdit.html的响应。有人认为没有细节,甚至我应该在其他地方问这个问题吗?我现在正在阅读和调试Lift自己的源代码,作为我项目的一个子模块,但是理解它需要时间。无论如何,任何意见都是值得赞赏的(好的……我已经放弃了以前的方法,决定使用并做我想做的事情。我仍然有一个问题,因为我想调用一个模板,这些示例调用代码片段。我们将看到。这非常冗长,我真的希望有一个更简单的方法来做。因此,我将把这个问题留长一点,看看是否有人来我在重写规则(更简单)中遇到了一个问题。你好,大卫。由于我的实现正在工作,我正在做其他事情,一段时间以来,我一直在推迟对此的答复。当我有时间的时候(当我添加处理页面可能具有的所有其他可能状态的代码时,就会发生这种情况,我将在此处发布结果)。不过感谢您的回答。:)