如何使用Lift Web Framework获取零个或多个参数

时间:2014-05-10 01:45:33

标签: lift

如何编写一个片段,该片段将采用零个或多个参数并在渲染方法中将它们提供给我?

我似乎无法在任何地方找到完整的例子,基本上我想要的是能够采取


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

并且能够访问Full(someValue)或Empty。

的案例对象

基本上是这样的,来自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"))

我想做一个更简单的版本,并希望得到任何帮助。我一直在使用“与我一起购物”和“pocketchange”示例项目,但还没有弄清楚如何连接所有的点。

2 个答案:

答案 0 :(得分:0)

如果您想要更快的回复,您应该查看Lift的官方支持频道,这是他们的邮件列表。 https://groups.google.com/forum/#!forum/liftweb

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

答案 1 :(得分:0)

最简单的解决方案之一就是拥有一个包装器,例如:

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"))

然后,在您的代码段中,您可以使用任一值:

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"))