2012-06-25 12 views
6

URLを返すドメインクラスに静的メソッドがあります。私はそのURLを動的に構築する必要がありますが、g.linkは機能しません。ドメインクラスでgrails g.linkを使用できません

static Map options() { 
    // ... 
    def url = g.link(controller: "Foo", action: "bar") 
    // ... 
} 

私は、次のエラーを取得:

Apparent variable 'g' was found in a static scope but doesn't refer to a local variable, static field or class. Possible causes: 
You attempted to reference a variable in the binding or an instance variable from a static context. 
You misspelled a classname or statically imported field. Please check the spelling. 
You attempted to use a method 'g' but left out brackets in a place not allowed by the grammar. 
@ line 17, column 19. 
      def url = g.link(controller: "Foo", action: "bar") 
        ^

1 error 

は明らかに私の問題は、私は、静的な文脈からgにアクセスしようとしているということなので、どのように私はこの問題を回避できますか?

+2

これは静的スコープでは行わないでください。インスタンスメソッドを使用するか、さらにはこのコードをサービスに入れて、注入することができます。 – OverZealous

+0

私はこれをやっている時にインスタンスがありません。 – ubiquibacon

+1

さて、私はOverZealousに同意します。このようにするのは本当に悪い考えです。 – Gregg

答えて

9

オブジェクトはtaglibであり、コントローラ内にあるようなドメインクラス内では利用できません。 How To Call A Taglib As A Function In A Domain Class

2+のGrailsでこれを行うには良い方法がそうのように、grailsLinkGeneratorサービスを通じて次のとおりです:ここに示すように、あなたはgrailsApplicationを通じてそれを得ることができ、両方のケースで

def grailsLinkGenerator 

def someMethod() { 
    def url = grailsLinkGenerator.link(controller: 'foo', action: 'bar') 
} 

、あなたはよ静的コンテキストからgrailsApplication/grailsLinkGeneratorを取得するためにいくつかの追加作業を行う必要があります。あなたのドメインクラスのプロパティを取得するのが最善の方法です。

def grailsApplication = new MyDomain().domainClass.grailsApplication 
def grailsLinkGenerator = new MyDomain().domainClass.grailsApplication.mainContext.grailsLinkGenerator 
+0

私はとても親切でした。私はlinkGeneratorを試してみましたが、静的コンテキストの警告が出ていました。あなたが提案したようにそれをドメインクラスから奪って、うまくいった。ありがとう! – ubiquibacon

5

Grails 2.xを使用している場合は、LinkGenerator APIを使用できます。ここでは例を挙げます。私が以前にテストしていたドメインクラスを再利用しているので、非URL関連の機能は無視されます。

class Parent { 
    String pName 

    static hasMany = [children:Child] 

    static constraints = { 
    } 
    static transients = ['grailsLinkGenerator'] 

    static Map options() { 
     def linkGen = ContextUtil.getLinkGenerator(); 
     return ['url':linkGen.link(controller: 'test', action: 'index')] 
    } 
} 

新しいユーティリティBeanの静的メソッド

@Singleton 
class ContextUtil implements ApplicationContextAware { 
    private ApplicationContext context 

    void setApplicationContext(ApplicationContext context) { 
     this.context = context 
    } 

    static LinkGenerator getLinkGenerator() { 
     getInstance().context.getBean("grailsLinkGenerator") 
    } 

} 

ビーン・デフとユーティリティクラス

beans = { 
    contextUtil(ContextUtil) { bean -> 
     bean.factoryMethod = 'getInstance' 
    } 
} 

あなたはベースURLが必要な場合は、リンクコールにabsolute:trueを追加します。

関連する問題