2009-10-22 19 views
6

簡単な質問: サービスクラス(helpersServiceとしましょう)とメソッドdef constructURI(params)があります。 このメソッドをテンプレートビューから呼び出す方法はありますか。ビュー内でGrailsサービスを呼び出す方法は?

私は成功

<% def helpersService = new HelpersService() // or def helpersService 
%> 
<img src="${helpersService. constructURI(params)}"/> 

せずに次のコードを試してみました。しかし、私は次のような結果を得る:任意のアイデア

No signature of method: com.HelpersService. constructURI() is applicable for argument types... 

または(場合には、私はdef helpersServiceを使用)

Cannot invoke method constructURI() on null object 

を?

+0

ここに答え http://stackoverflow.com/questions/2510929/how-do-i-call-a-grails-service-from-a-gsp/19378586#19378586 –

答えて

19

サービスはビューの内部で使用することはできません。依存関係注入を介してサービスへの参照を取得できるTagLibを作成することができます。

+0

をはい、タグライブラリがありますどんなにクリーンでもあります。 – mbrevoort

+1

も参照してください。 http://stackoverflow.com/questions/2510929/problem-calling-grails-service-from-gsp taglib例: http://stackoverflow.com/a/7005752/160799 (私にはあまりきれいに見えません。私は以下のソリューションhttp://stackoverflow.com/a/1652410/160799を好む - まだGrailsには新しかったが、検索結果リストの項目のアクセス権に基づいて表示を処理する方法は他にない。 – Gregor

1

は、まあ、私は次のコードでの回避策を発見した:

def helpersService = grailsApplication.classLoader.loadClass('HelpersService').newInstance() 

依存性注入を介してサービスを利用する方が良いしかし、私はジークフリートのアドバイスを試してみます。

7

簡単にする方法は、あなたのビューがコントローラによってレンダリングされていると仮定すると、すなわち、ちょうどモデル内のビューにアクションからサービスへの参照を渡すことです:

class someController { 
    def someService 
    def someAction = { 
    render(view: 'someView', model: ['someService': someService]) 
    } 
} 

次いでそれをすることができビュー内で期待通りに使用されます。ビューでレンダリングされたテンプレートでは、明らかにテンプレートへの参照も渡す必要があります。ただ、明確にするために、S.プッチバウアーは正しいです。ビュー内でサービスが実際に使用されることは想定されておらず、特にトランザクションやHibernateセッションに関連する問題を診断するのが難しい場合があります。

2

私はこのグルーヴィーインラインコードが動作すること、が分かった:

<% def xxxService = application.getAttribute("org.codehaus.groovy.grails.APPLICATION_CONTEXT").getBean("xxxService") %> 

あなたはちょうどこのようなサービスの機能を呼び出すことができます。

<g:select optionKey="key" from="${xxxService.getWhateverList()}" name="tarif" value="${accountInstance?.tarif}" ></g:select> 
+0

これは、すべてのページで必要となるので、ユニバーサルヘッダービューのピンチでこれを使用しました –

+0

コードからは、これは良いパターンではないことは明らかです。 –

1

あなたがタグのlibを作成することなく、簡単にこれを行うことができますセットタグ使用することにより:

<g:set var="versionService" bean="versionService"/> 
... 
<p>version ${versionService.clientVersion}</p> 

を私はここで、この解決策を見つけた:http://mrhaki.blogspot.com/2013/08/grails-goodness-use-services-in-gsp.html

関連する問題