在Lift中,更改Menu.param的行为方式

时间:2012-03-23 18:11:25

标签: scala lift sitemap

编辑:我刚刚意识到我的问题不在于示例不起作用!这是页面没有出现在菜单中!另外,如何处理没有参数的页面?

我很难找到Menu.param的通用定义。 Simply Lift中有一个例子,在这个论坛中有一些代码参考,但这个特征很重要,而且,据我所知,还没有很好的记录。

目前,我的网站地图存在问题。我在sitema Boot.scala中声明的任何内容和代码似乎都被接受但后来被忽略了。 localhost:8080 / journal导致404,菜单项“Autobiography”没有出现在站点地图中。

因此,一方面,这篇文章是对此代码的求助。为什么被忽略? (同样,它编译并执行时没有错误。)

另一方面,在David Pollack的例子之外,它只是我还是“param”没有记载?它不在API中:http://main.scala-tools.org/ mvnsites / liftweb-2.0 / framework / scaladocs / net / liftweb / sitemap / Menu $ object.html。

感谢。

这是我的站点地图。我在Simply Lift中添加了Param示例,看它是否有效。它没有。

def sitemap = SiteMap(
  Menu.i("Home") / "index" >> User.AddUserMenusAfter, // the simple way to declare a menu
  Menu.i("Artifact") / "artifact", // Works
  // Menu.i("Autobiography") / "journal", // Works if I comment out the next line.
  AutobiographyPageMenu.menu,
  Menu.param[AutobiographyPage](​"Autobiography2", "Autobiography2", // Similar code as previous line. Doesn't work.
                                pageName => Full(AutobiographyPage(​pageName)),
                                ap => ap.pageName) / "journal2",
  Param.menu, // Added to see if D. Pollack's code would work. It didn't.

  // more complex because this menu allows anything in the
  // /static path to be visible
  Menu(Loc("Static", Link(List("static"), true, "/static/index"),
           "Static Content")))

这是它引用的代码,来自代码段子包中的文件。 Lift可以找到类:它不会抱怨它们没有被定义。

case class AutobiographyPage(pageName: String)

object AutobiographyPageMenu {

  val menu = Menu.param[AutobiographyPage](​"Autobiography", "Autobiography",
                                           pageName => Full(AutobiographyPage(​pageName)),
                                           ap => ap.pageName) / "journal"
  // I'm not sure what these two lines are for...
  lazy val loc = menu.toLoc
  def render = "*" #> loc.currentValue.map(_.​pageName)
}

// This code is copied from the Simply Lift book:

// capture the page parameter information
case class ParamInfo(theParam: String)

// a snippet that takes the page parameter information
class ShowParam(pi: ParamInfo)  {
  def render = "*" #> pi.theParam
}

object Param {
  // Create a menu for /param/somedata
  val menu = Menu.param[ParamInfo]("Param", "Param",
                                   s => Full(ParamInfo(s)),
                                   pi => pi.theParam) / "param"
  lazy val loc = menu.toLoc

  def render = "*" #> loc.currentValue.map(_.​theParam)
}

1 个答案:

答案 0 :(得分:1)

如您所见,您有两个相同路径的菜单引用:

// Menu.i("Autobiography") / "journal", // Works if I comment out the next line.


val menu = Menu.param[AutobiographyPage](
  ​"Autobiography", "Autobiography", 
  pageName => Full(AutobiographyPage(​pageName)),
  ap => ap.pageName) / "journal"

它们都匹配http://localhost/journal,并且具有相同的菜单ID“自传”,这就是它无效的原因。

您可以尝试在AutobiographyPageMenu.param中更改菜单ID“Autobiography”,看它是否有效。