6

問題: コントローラーのアクションに、モデルを渡さずにレンダリング タグが含まれています。get で始まるアクションがあります。

grails-app/views/site/home.gsp:

homepage

SiteController.groovy:

class SiteController {

    def index() {
        render (view: "home")
    }

    def getTest() {
        render "getTest"
    }

}

localhost:8080/site でサイトにアクセスし、SiteController の index アクションを実行します。

期待される出力: ホームページ 実際の出力: getTest ホームページ

index の render アクションが次のように変更された場合:

render(view: "home", model: [:])

期待される出力が生成されます。

アクション名の get という単語の前に文字を追加すると、期待される出力が生成されます。

興味深いことに、IDEA では getTest() は紫に色分けされています。get という単語が先頭にある複数のメソッドがある場合、それらはすべて実行されることにも注意してください。

これは Grails 1.3.6 では発生しませんでした。これは、新しい Grails 2.2.2 プロジェクトで再現可能であり、バグのように思えます。なぜこうなった?

4

1 に答える 1

8

GRAILS-9310は、これが変更されない既知の制限であることを示唆しています。回避策は、 action に名前を付けないことget*です。根本原因は

明示的なモデルが返されない場合、コントローラーのプロパティがモデルとして使用されます ( Grails docs ) 。

メソッドを定義すると、getTest()これはコントローラーにプロパティがあることを意味しtest、明示的なモデルなしで「ホーム」ビューをレンダリングすると、コントローラーのプロパティが列挙されてモデル マップが形成されます。メソッドは、このgetTest()列挙プロセスの一部として呼び出されます。

URL に実際に表示する必要がある場合getTestは、実際のアクションに別の名前を付けてから、カスタム URL マッピングを定義し/controller/getTestて、名前を変更したアクションに URI を送信する必要があります。

于 2013-06-24T17:08:22.560 に答える