GrailsのScaffoldingとWicketプラグインの共存について
前回からの続きです。
さて、Wicketプラグインをインストールしたはいいが、従来のGrailsのScaffoldingと共存が出来れば、いろいろとおもしろい使い方が出来ると思われます。
まずは、
- grails-app/conf/*UrlMappings.groovy を削除。
- ドメインクラスの作成(User.groovy)。
- ドメインコントローラの作成(UserController.groovy)。
- 動的scaffoldingの指定(def scaffold = User.class)。
をしてみます。その結果、
- 「http://localhost:8080/wickethello/app」は、"Hello World!"と表示
- 「http://localhost:8080/wickethello/user」は、「404 Not Found」エラー
となります... orz
次に、上記の状態から、
- grails-app/conf/*UrlMappings.groovy を復活(ただし、最初に作成された状態で)。
をしてみます。その結果、
- 「http://localhost:8080/wickethello/app」は、「404 Not Found」エラー
- 「http://localhost:8080/wickethello/user」は、Userの一覧画面が表示
となります... orz
推察するに、「grails-app/conf/*UrlMappings.groovy」の有無でこの違いとなるため、手がかりはこのファイルにあるのではないかと。
で、このファイルを見てみます。
とあり、「http://localhost:8080/wickethello/user」の"/user"、「http://localhost:8080/wickethello/app」の"/app"が上記のURL mappingsにマッチし、マッチした場合は、Grailsのサーブレットが動いてしまうのではないかと。で、UserControllerはあるのでリスト表示されるが、AppControllerはないので「404 Not Found」になるのではないかと。
class WickethelloUrlMappings {
static mappings = {
"/$controller/$action?/$id?"{
constraints {
// apply constraints here
}
}
}
}
とすると、AppControllerを作成しても意味がないので、「"/app"をURL mappingsにマッチさせなければよいのでは?」となります。
で、「"/app"をマッチさせない」方法が見つけられなかったので、「"/user"がマッチする」方法をとりました。つまり、
という方法です。この変更で実行すると、
class WickethelloUrlMappings {
static mappings = {
"/user/$action?/$id?"{
controller = "user"
}
}
}
- 「http://localhost:8080/wickethello/app」は、"Hello World!"と表示
- 「http://localhost:8080/wickethello/user」は、Userの一覧画面が表示
となりました(^_^)V
ただし、この方法では、URLマッチさせたい設定をすべて記述する必要があります。コントローラの数が多いと馬鹿になりません(-_-;) 誰か、もっとスマートな方法をご存じありませんか?