2011-11-07 49 views
0

我有一個玩!包含冗餘代碼的兩個操作的框架。所以我將這個代碼分解成了一個private static方法,但它不再工作了。在Play中調用靜態方法!框架控制器不起作用

public static void show(long itemId, String listId) { 
    render(getItem(itemId, listId)); 
    } 

    private static Item getItem(long itemId, String listId) { 
    // otherwise duplicate code ... 
    return item; 
    } 

如果我內聯包含在getItemshow一切行動的代碼是罰款:

// this works 
    public static void show(long itemId, String listId) { 
    Item item = // duplicate code ... 
    render(item); 
    } 

爲什麼我不能叫戲中其他的靜態方法!控制器?

解決方案

感謝「Codemwnci」我已經實現了以下解決方案:

public static void show(long itemId, String listId) { 
    renderArgs.put("item", getItem(itemId, listId)); 
    render(); 
    } 

我喜歡renderArgs因爲它使意圖,而不是一個局部變量更加清晰。

+0

請記住,如果您使輔助方法公開重定向發生。請參閱http://stackoverflow.com/questions/3899670/how-can-i-influence-the-redirect-behavior-in-a-play-controller。這不是你現在的問題,但可能是下一個發生一些魔術的地方。 – niels

+0

謝謝,我知道它。 – deamon

回答

4

將局部變量傳遞到render方法時,會在傳遞到Groovy視圖時使用局部變量的名稱。在你的例子中,你沒有傳遞一個局部變量,因此Play不知道給你指定的項目指定了什麼名字。

您有幾個選項。你可以做任何

  1. 從設置到的getItem一個局部變量(項目)的回報,並通過項目到視圖
  2. 設置從的getItem返回到renderArgs地圖,並指定自己的名字。

選項1可能是最明智的選擇。

+0

謝謝。 (我真的不喜歡這種魔法。) – deamon

+1

它是Play2.0中要解決的問題之一,但是這種約定通過不必將變量從控制器映射到視圖中而顯着減少了代碼 – Codemwnci

相關問題