我有一些控制器功能使用不同的视图模板进行渲染。这些工作按预期工作,但是,控制器函数中的代码非常相似,并且要求重构为一个通用函数。所以,我需要这样的东西:
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?
答案 0 :(得分:1)
您可能必须在refactoredFunc中引入一个类型参数。由于Play用于发送响应的机制,您还需要声明隐式Writeable
参数。
def refactoredFunc[C](view: C)(implicit writeable: Writeable[C]) = {
Ok(view)
}
使用此代码,您可以使用隐式可用refactoredFunc
的任何类型C
来呼叫Writeable[C]
。 Play会自动为其常见用例定义这些含义,例如Html
,....