2014-03-04 23 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) 
} 

有了這個代碼,你可以調用refactoredFunc與任何類型的C其中有一個Writeable[C]隱含可用。比賽將自動定義這些implicits其常見的使用情況,像Html,....

+0

謝謝!雖然這不是我需要的確切解決方案(我過分簡化了我的問題描述 - 這些觀點也需要爭論) - 它確實指向了我的正確方向: – ishaaq

相關問題