2011-11-07 5 views
0

私はプレイを持っています!冗長コードを含む2つのアクションを持つフレームワーク。だから、私はこのコードを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; 
    } 

私はshowアクションすべてにgetItemに含まれるコードをインライン化した場合罰金です:

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

は、なぜ私がプレイ内の他の静的メソッドを呼び出すことはできません!コントローラ? 「Codemwnci」に

ソリューション

おかげで、私は以下のソリューション実装しました:それはローカル変数より意図がより明確になりますので、私はrenderArgsを好む

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

を。

+0

ヘルパーメソッドをパブリックにすると、リダイレクトが発生することに注意してください。 http://stackoverflow.com/questions/3899670/how-can-i-influence-the-redirect-behavior-in-a-play-controllerを参照してください。これはあなたの現在の問題ではありませんが、いくつかの魔法が起こる次のものになる可能性があります。 – niels

+0

ありがとう、私はそれを認識しています。 – deamon

答えて

4

レンダリングメソッドにローカル変数を渡すと、ローカル変数の名前がGroovyビューに渡されるときに使用されます。あなたの例では、ローカル変数を渡していないので、Playは指定した項目にどの名前を付けるか分かりません。

あなたにはいくつかのオプションがあります。あなたはどちらか

  1. は、ローカル変数(項目)へのgetItemからの復帰を設定してやる、とrenderArgsマップへのgetItemからの復帰を設定ビュー
  2. にアイテムを渡すと、自分の名前を指定することができます。

オプション1がおそらく最も賢明です。

+0

ありがとうございます。 (私は実際にこの種の魔法を嫌います。) – deamon

+1

これはPlay2.0で扱われることが意図されているものの1つですが、このコンベンションでは、コントローラからビューに変数をマップする必要がないため、コードが大幅に削減されます – Codemwnci

関連する問題