4

Grails でサービスを使い始めたばかりで、サービス内からページをレンダリングしようとすると問題が発生します。以下に示すいくつかの方法を試してみましたが、うまくいきませんでした。

サービスコール 1:

GroupCheckService.isEnabled(userObjects.group.notenabled)

サービス試行 1:

import grails.gsp.PageRenderer

class GroupCheckService {

    PageRenderer groovyPgeRenderer
    static transactional = false

    def isEnabled(boolean notenabled) {

        if(notenabled == true){
            groovyPgeRenderer.render(view: '/locked')

        }else{
            return
        }

    }
}

サービスコール 2:

GroupCheckService.isEnabled(render, userObjects.group.notenabled)

サービス試行 2:

class GroupCheckService {

    PageRenderer groovyPgeRenderer
    static transactional = false

    def isEnabled(Closure render, boolean notenabled) {

        if(notenabled == true){
            render.call view:"/locked"

        }else{
            return
        }

    }
}

方法 1 を試してもエラーは発生しませんが、IF が満たされたときにページがレンダリングされません。方法 2 では次のエラーが発生します。

no such property render

これを達成する方法についてアドバイスや助けをいただければ幸いです。事前に感謝します:)

4

2 に答える 2

4

サービスからビューをレンダリングするべきではありません - これはコントローラの一部です。

ビジネス ロジックや (トランザクション) データベース操作にサービスを使用します。

grails ドキュメントから:

Grails のサービスは、アプリケーションに大部分のロジックを配置する場所であり、コントローラーはリダイレクトなどのリクエスト フローの処理を担当します。

ビュー from サービスを本当にレンダリングしたい場合は、mrhaki がfrom サービスの使用についてブログに書いていPageRendererます。

import grails.gsp.PageRenderer

class GroupCheckService {
    PageRenderer groovyPageRenderer

    def isEnabled(Closure render, boolean notenabled) {
        if(notenabled == true){
            groovyPageRenderer.render view: "/locked"
        }else{
            return
        }
    }
}

リクエスト範囲外の作業のSitemeshため、レイアウトはご利用いただけませんのでご注意ください。PageRenderer

最善の方法は、アプリケーションを再設計して、レンダリングをコントローラーに残すことです。

于 2013-10-02T08:42:24.260 に答える
1

まず第一に、サービスからの HTTP 応答をレンダリングすることは非常に悪い習慣です。

コードについては、最初のアプローチを使用する必要がありますgroovyPgeRenderer.render。しかし、あなたはこの呼び出しの結果を使用していません。を返すメソッドですStringdocsを参照)

そのため、その文字列を手動で HTTP 応答に入れる必要があります。RequestContextHolder.currentRequestAttributes()Controller から、または( docsを参照)から HttpServlet 応答を取得できます。お気に入り:

String html = groovyPageRenderer.render(view: '/locked')
def response = RequestContextHolder.currentRequestAttributes().response
response.setStatus(200)
response.setContentType('text/html')
response.writer.write(html)
于 2013-10-02T09:52:33.290 に答える