2011-01-20 57 views
3

我有一個圖片類:提升Web框架DRY調度

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

它覆蓋toHtml方法:

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

和它的作品東陽的這個:

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

,你可以看到這是而不是DRY的方法,因爲你必須定義URL(/ gallery/image )兩次。

是否可以讓它變幹?你能從LiftRules或其他東西獲得路徑嗎?

在此先感謝, Etam。

+0

我對升降機一無所知,但我不認爲這是重複你的。我更像是`val a =「foo」; println(a)`,我提到過`a`兩次,一次說出`a`做了什麼,一次就叫它。我猜這個URL字符串被創建的方式存在錯誤的空間,但它仍然足夠簡單... – huynhjl 2011-01-20 15:21:07

回答

4

這是電梯名單上回答了David Pollak

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

總之,你:

中的對象封裝在共同的東西(在這種情況下,路徑):

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

創建一個自定義的unapply方法,允許您在調度方法中使用模式匹配中的對象。

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

你的代碼現在:

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

...和:

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

查看郵件線索的更多建議。