将通用视图模板作为函数参数传递

时间:2014-03-04 22:19:45

标签: playframework playframework-2.0

我有一些控制器功能使用不同的视图模板进行渲染。这些工作按预期工作,但是,控制器函数中的代码非常相似,并且要求重构为一个通用函数。所以,我需要这样的东西:

def controller1() = Action {
  // call some controller1-specific logic here
  refactoredFunc(views.html.view1)
}

def controller2() = Action {
  // call some controller2-specific logic here
  refactoredFunc(views.html.view2)
}

def refactoredFunc(view: play.api.templates.Html) = {
  // some common logic here
  Ok(view)
}

上述工作(好吧,至少它编译),但我不满意指定refactoredFunc仅接受Html模板作为输入,因为这是一个不需要的人为约束。< / p>

我尝试用play.api.templates.Html替换play.api.templates.BufferedContent[_],但编译器不喜欢这样。

那么,有没有一种通用的方法可以做到这一点,而不强制视图是Html?

1 个答案:

答案 0 :(得分:1)

您可能必须在refactoredFunc中引入一个类型参数。由于Play用于发送响应的机制,您还需要声明隐式Writeable参数。

def refactoredFunc[C](view: C)(implicit writeable: Writeable[C]) = {
    Ok(view)
}

使用此代码,您可以使用隐式可用refactoredFunc的任何类型C来呼叫Writeable[C]。 Play会自动为其常见用例定义这些含义,例如Html,....