2012-04-27 2 views
0

私はいくつかの基本的なユーティリティ機能を持っている私のコントローラに追加するmixinを作成しています。ミックスインで実行したい機能の1つは、g.message taglibを使用して文字列にエラーを解決することです。残念ながら、静的なmixinメソッド内のGrailsApplicationにアクセスできないようです。MixinでGrailsApplicationにアクセスするには?

mixinからGrailsタグライブラリにアクセスするにはどうすればよいですか、それとも私がやっていることを達成する良い方法がありますか?すべてのコントローラ間で共通のコードを共有していますか?

私が実行しているコードは次のとおりです。私は、問題は静的メソッドでGrailsのタグLIBSにアクセスする方法であると思う:

  static def preparePostResponse(domainInstance) { 

        def grailsApplication = new User().domainClass.grailsApplication 


        def postResponse = new AjaxPostResponse(domainObject: domainInstance) 

        if (domainInstance.hasErrors()) { 
         g.eachError(bean: domainInstance) { 
          postResponse.errors."${it.field}" = g.message(error: it) 
         } 
         postResponse.success = false 
         postResponse.message = "There was an error" 
        } 
        else { 
         postResponse.success = true 
         postResponse.message = "Success" 
        } 
        return postResponse 
       } 

答えて

0

あなたはいくつかの技術のいずれかを使用して、アプリケーション内のどこからでもgrailsApplicationにアクセスすることができます。 GrailsApplicationHolderは廃止されましたが、Burt Beckwithはcouple of solutions in this blog postingです。

は、おそらく最も簡単な1はそうのように、既存のドメインからそれを引っ張っている。

class MyMixin { 
    static myMethod() { 
     def grailsApplication = new MyDomainClass().domainClass.grailsApplication 
     // use it like normal here 
    } 
} 

彼はvariables in BootStrap using metaClass hereを設定する別の方法があります。


また、アプリケーションにアクセスするための専用のクラスを作成するthis blog postに優れた技術を、あなたはより複雑に使用することができますが、(私は思います)。これは、複数の場所で使用する場合には便利です。私はそれをこのように書くことがずっときれいだなどgrailsApplicationためにゲッターを持って自分のアプリケーション内の専用AppCtxクラス、configを、作成した:

def foo = AppCtx.grailsApplication... 
+0

私はあなたの提案を試みたが、grailsApplicationがアクセス可能でしたが、私がnull入門しましたポインタの例外はgroovyの腸のどこかにある。私は静的メソッド内でg:タグ、g:forEachを使用することに関連していると思います。私はこのメソッドをコントローラ自体に移しました - まだ静的にしていますが、この例外がありました。 '静的なスコープ内に見かけの変数 'g'が見つかりましたが、ローカル変数は参照しませんでした。静的メソッドからg:タグにアクセスできますか? –

関連する問題