scala - 提升 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)
        }
    }
}

如您所见,这是不干的方法,因为您必须定义 URL (/gallery/image) 两次。

是否可以让它变干?你能从 LiftRules 或其他东西得到路径吗?

提前致谢, 艾特姆。

最佳答案

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 :: _), _, _) => // ...

查看消息线程以获取更多建议。

https://stackoverflow.com/questions/4748539/

相关文章:

recursion - 对于每个递归算法都可以创建等效的非递归版本吗?

.net - 如何从带有procdump(或类似文件)的.Net应用程序中捕获未处理的异常?

boost-preprocessor - Boost.Preprocessor 是独立的吗?

oop - [incr Tcl] 中的静态函数继承

security - 编写自动更新客户端时我必须担心哪些安全问题?

.net - 以整数开头的标识符

.net - 如何拦截自定义处理的 WPF 绑定(bind)

maven - 有没有办法在 Maven 中包含同一 Artifact 的两个版本?

teamcity - 是否可以在团队城市 build 中添加自由文本注释?

task - Guice:提供程序中的注入(inject)器