2014-03-04 6 views
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 템플릿을 허용하는지 지정에 대한 불만이 거기있어.

play.api.templates.Htmlplay.api.templates.BufferedContent[_]으로 바꾸려고했지만 컴파일러가 그 것을 좋아하지 않습니다.

그래서보기가 Html임을 강제하지 않고도이 작업을 수행 할 수있는 일반적인 방법이 있습니까?

답변

1

아마도 refactoredFunc에 형식 매개 변수를 도입해야합니다. Play에서 응답을 보내기 위해 사용하는 메카니즘 때문에 암시적인 Writeable 매개 변수를 선언해야합니다. 이 코드

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

, 당신은 Writeable[C] 암시 적으로 사용할 수있는 모든 종류의 CrefactoredFunc를 호출 할 수 있습니다. Play는 Html과 같은 일반적인 사용 사례에 대해 이러한 암시를 자동으로 정의합니다.

+0

감사합니다. 그게 내가 필요로하는 정확한 해결책이 아니었지만 (내 문제 설명을 지나치게 간소화 시켰습니다. 그 견해도 논점을 가지고있었습니다) 그것은 올바른 방향으로 나를 지적했습니다 : – ishaaq

관련 문제