我如何编写一个片段,将采取零或多个参数,并使它们在呈现方法中可供我使用?
我似乎找不到一个完整的例子,基本上我想要的是能够使用
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"))