Hi Jeppe, thanks, that looks like what I need! On Feb 6, 3:03 am, Jeppe Nejsum Madsen <[email protected]> wrote: > Alex Black <[email protected]> writes: > > Hi, I'd like to rewrite a url like this: > > > /manufacturer/product > > > e.g. > > > LiftRules.statelessRewrite.append( { > > case RewriteRequest( > > ParsePath( manufacturerName :: productName :: Nil, _, _,_), _, > > _) => > > > RewriteResponse("productView" :: Nil) > > }) > > > But, I'd like to the ParsePath case to not 'catch' for non-existant > > manufacturers, and non-existant products by the manufacturer. > > > So, I might do this: > > > LiftRules.statelessRewrite.append( { > > case RewriteRequest( > > ParsePath( Manufacturer(manufacturer) :: Product(product) :: > > Nil, _, _,_), _, _) => > > > RewriteResponse("productView" :: Nil) > > }) > > > Where Manufacturer and Product objects provide an extractor which does > > a lookup. > > > However, the product lookup depends on the manufacturer.. is there a > > way to handle that? > > > ideas: > > 1. use an if guard > > > case RewriteRequest( > > ParsePath( Manufacturer(manufacturer) :: productName :: Nil, > > _, _,_), _, _) if manufacturer.contains(productName) => > > val product = manufacturer.getProduct(productName) > > > sucks because it looks up the product twice. > > > 2. some time of nested case? > > > case RewriteRequest( > > ParsePath( Manufacturer(manufacturer) :: Product(manufacturer, > > product) :: Nil, _, _,_), _, _) => > > > obviously doesn't work.. > > > any suggestions welcome, thanks! > > You could write you own extractor. Here's an example from production > code :-) > > override val rewrite: LocRewrite = Full(NamedPF(name) { > case RewriteRequest(ParamsExtractor(account,orgUnit) , _, _) => > (RewriteResponse(path), Full(account, orgUnit)) > }) > > object ParamsExtractor { > def unapply(pp:ParsePath): Option[(Account, OrgUnit)] = { > val result:Box[(Account, OrgUnit)] = if > (pp.wholePath.startsWith(path) && pp.wholePath.length == (path.length + 2)) { > val res = for {decrypted1 <- > FleetZoneRules.decrypt(pp.wholePath(path.length)) > account <- > urlAccount.is.choice(Full(_))(Account.find(decrypted1)) > decrypted2 <- > FleetZoneRules.decrypt(pp.wholePath.last) > orgUnit <- > urlOrgUnit.is.choice(Full(_))(OrgUnit.find(decrypted2)) if (orgUnit.account > == account)} yield { > urlAccount(Full(account)) > urlOrgUnit(Full(orgUnit)) > (account, orgUnit) > } > log.debug("Decoded URL: %s=%s".format(pp,res)) > res > } > else > None > result > } > } > > /Jeppe
-- You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
