如何在Lift Web框架中使用零或多个参数

  • 本文关键字:参数 Lift Web 框架 lift
  • 更新时间 :
  • 英文 :


我如何编写一个片段,将采取零或多个参数,并使它们在呈现方法中可供我使用?

我似乎找不到一个完整的例子,基本上我想要的是能够使用


localhost:8080
localhost:8080/
localhost:8080/somevalue

,并且能够访问Full(someValue)或Empty的case对象。

基本上是这样的,从https://www.assembla.com/spaces/liftweb/wiki/Location_Parameters


menu = Menu.params[(Product,ProductReview)](
  "ProdInfo",
  "Product Information",
  ids => {
    case prodId :: revId :: Nil =>
      (findProductById(prodId), findReviewById(revId)) match {
        case (Full(product), Full(review)) => Full((product, review))
        case _ => Empty
      }
    case _ =>
      Empty
  }
  productandreview => {
    case (product, review) =>
      getIdForProduct(product) :: getIdForReview(review) :: Nil
  }
) / "products" >> If(() => S.loggedIn_?, () => RedirectResponse("/login"))

我想做一个更简单的版本,并将感谢任何帮助。我一直在研究"shop with me"one_answers"pocketchange"的例子项目,但还没有弄清楚如何将所有的点联系起来。

如果您想要更快的响应,您可能应该查看Lift的官方支持频道,那是他们的邮件列表。https://groups.google.com/forum/!论坛/liftweb

要处理URL,您有几个选项。我知道的有:

  • 获取URL并手动处理,通过S.uri/s.request.*.uri

  • 使用休息。您可以在那里指定一个未知或可选的路径。https://www.assembla.com/wiki/show/liftweb/REST_Web_Services

最简单的解决方案之一是使用包装器,如:

case class ProductTupleMode(items:Box[(Product,ProductReview)] = Empty)

然后你可以像下面这样设置你的站点规则:

menu = Menu.params[ProductTupleMode](
  "ProdInfo",
  "Product Information",
  ids => {
    case prodId :: revId :: Nil =>
      (findProductById(prodId), findReviewById(revId)) match {
        case (Full(product), Full(review)) => 
          Full(ProductTupleMode(Box !! (product, review)))
        case _ => Full(ProductTupleMode())
      }
    case _ =>
      Full(ProductTupleMode())
  },
  productandreview => {
    case ProductTupleMode(Full((product, review))) =>
      getIdForProduct(product) :: getIdForReview(review) :: Nil
  }
) / "products" / ** >> If(() => S.loggedIn_?, () => RedirectResponse("/login"))

在你的代码片段中你可以使用value:

class MySnippet(m:ProductTupleMode) {
  def render = m match {
    case Full(m.items) => ...
    case _ => ...
  }
}   

我认为这将是最干净和最容易遵循的,但是如果你真的需要在你的代码片段中有签名Box[(Product, ProductReview)],那么你也可以像这样返回Box[Box[(Product, Product)]]:

menu = Menu.params[Box[(Product,ProductReview)]](
  "ProdInfo",
  "Product Information",
  ids => {
    case prodId :: revId :: Nil =>
      (findProductById(prodId), findReviewById(revId)) match {
        case (Full(product), Full(review)) => Full(Full((product, review)))
        case _ => Full(Empty)
      }
    case _ =>
       Full(Empty)
  },
  productandreview => {
    case Full((product, review)) =>
      getIdForProduct(product) :: getIdForReview(review) :: Nil
  }
) / "products" / ** >> If(() => S.loggedIn_?, () => RedirectResponse("/login"))

最新更新