2011-01-20 2 views
3

J'ai une classe Image:Lift Web Framework d'expédition SEC

class Image extends LongKeyedMapper[Image] with IdPK with Logger { 

qui remplace la méthode toHtml:

override def toHtml = 
    <img src={"/gallery/image/%s/%s/%s/%s" format (slug.is, "fit", 100, 100)} /> 

et il fonctionne beacause de ceci:

def dispatch = { 
    LiftRules.dispatch.append { 
     case Req("gallery" :: "image" :: slug :: method :: width :: height :: Nil, _, _) => { 
      () => Image.stream(slug, method, width, height) 
     } 
    } 
} 

Comme vous pouvez voir c'est approche pas DRY, puisque vous devez définir l'URL (/ gallery/image) deux fois.

Est-il possible de le rendre SEC? Pouvez-vous obtenir le chemin de LiftRules ou quelque chose?

Merci d'avance, Etam.

+0

Je ne sais rien à propos de Lift, mais je ne vois pas cela comme une répétition. Je le vois plus comme 'val a =" foo "; println (a) ', bien je mentionne deux fois' a', une fois pour dire ce que 'a' fait et une fois pour l'appeler. Je suppose qu'il y a place à l'erreur dans la façon dont la chaîne d'URL est créée mais c'est quand même assez simple ... – huynhjl

+0

Il y a quelque chose que j'aime dans Django - HttpResponseRedirect (reverse ('arch-summary', args = [1945])). La méthode inverse est quelque chose que je cherche. – Etam

Répondre

4

Cela a été répondu par David Pollak sur la liste de levage:

https://groups.google.com/d/topic/liftweb/VG0uOut9hb4/discussion

En bref, vous:

encapsulent les choses en commun (dans ce cas, le chemin) dans un objet:

object ImageGallery { 
    val path = "gallery" :: "image" :: Nil 
    val pathLen = path.length 
    def prefix = path.mkString("/", "/", "/") 
} 

créer une méthode personnalisée qui vous permet d'utiliser l'objet dans la correspondance de modèle de votre méthode de répartition.

object ImageGallery { 
    // ... 
    def unapply(in: List[String]): Option[List[String]] = 
    Some(in.drop(pathLen)).filter(ignore => in.startsWith(path)) 
} 

Votre code est maintenant:

<img src={ImageGallery.prefix+"%s/%s" ...}> 

... et:

case Req(ImageGallery(slug :: method :: width :: height :: _), _, _) => // ... 

Voir le fil de message pour plus de suggestions.