如何编写一个片段,该片段将采用零个或多个参数并在渲染方法中将它们提供给我?
我似乎无法在任何地方找到完整的例子,基本上我想要的是能够采取
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”示例项目,但还没有弄清楚如何连接所有的点。
答案 0 :(得分:0)
如果您想要更快的回复,您应该查看Lift的官方支持频道,这是他们的邮件列表。 https://groups.google.com/forum/#!forum/liftweb
要处理URL,您有几个选项。我所知道的是:
只需获取网址并通过S.uri
/ s.request.*.uri
使用REST。您可以在那里指定未知路径或可选路径。 https://www.assembla.com/wiki/show/liftweb/REST_Web_Services
答案 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"))