0

私はgrails 2.2.0アプリケーションを持っています。グローバル フィルターを作成しましたが、これにはいくつかのチェックがあります。チェックが失敗した場合は、render view: viewFileName を使用して静的ビュー ファイルをレンダリングし、フローを終了します。それ以外の場合は、アプリが続行できることを示す true を返します。login アクションでは、render view: loginFileName を呼び出すログイン ビューがレンダリングされますが、代わりに viewFileName が表示されます。フィルター パスはすでに通過しており、そのチェックインも通過していることに注意してください。この問題は、以前の記事「Grails "respond" renders the wrong view when launched from .war file」に似ているよう です ただし、違いは、同じ名前の 2 つのインデックス ビュー ファイルが別のコントローラーにあることですが、ここでは、条件が満たされていない場合でも表示されるビューをレンダリングするフィルターがあります。これが問題であることを確認するために、render view: viewFileName in filter with render "< div>....< /div >" を削除すると、すべてうまく機能しました。つまり、アクションは静的ページではなく適切なページを表示しました. 必要に応じて詳細を投稿できます。文字列に含まれるそのページをレンダリングすることに頼ることはできません。それは長期的ではないからです。問題のある2つのクラスは次のとおりです

 class MainController {

    def login() {
        def param = getHeaderParameters()
        render view: "login", model: param
    }
}

class MainFilters {
    private final String mainControllerName = "main"
    private final String startPage = "start"
    def GrailsConventionGroovyPageLocator groovyPageLocator

    def filters = {
        all(controller: '*', action: '*') {
            before = {
                if (AdminUtils.isStart(request)) {
                    println "rending start page...."
                    final fileView = "/$mainControllerName/$startPage"
                    render view: fileView
                }
            }
        }
    }
4

1 に答える 1

1

ページをレンダリングしてリダイレクトしない場合、false を返さない場合、アクションは before チェックの後に呼び出されます。あなたのシナリオでは、アクションが呼び出されたくないので、その後 false を返す必要があります。

def filters = {
        all(controller: '*', action: '*') {
            before = {
                if (AdminUtils.isStart(request)) {
                    println "rending start page...."
                    final fileView = "/$mainControllerName/$startPage"
                    render view: fileView
                    return false 
                }
            }
        }
    }
于 2013-10-15T13:31:31.040 に答える