環境: scala 2.10、play 2.1.1、eclipse 4.2
ユースケース : ユーザーは、データベース内のオブジェクト (ゲーム) を示すリンクをクリックします。ajax リクエストは Javascript Route を介してコントローラーに送信され、コントローラーはゲーム データをロードし、json に変換してビューに送り返します。ajax 成功コールバックは、ゲーム タイトルを div に出力します。
問題: json を取得できませんが、html ページ (ajax 要求が送信されたページ) が取得されます。
問題はルーターにあると思われます。javascript ルート アクションに print("route") を配置し、ロード ゲーム アクションに print("load game") を配置しました。「ルート」はコンソールに表示されますが、「ロード ゲーム」は表示されません。私の loadGame(id) ルートからも来るかもしれませんが、どのように設定すればよいかわかりません。
これが私のコードです。
ルート:
# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~
# Home page
GET / controllers.Application.index
# Javascript routes
GET /javascriptRoutes controllers.Application.javascriptRoutes
# Library
GET /library/:id controllers.UserController.library(id: Long)
GET /library/:id controllers.GameController.loadGame(id: Long)
意見:
<div class="span2">
<ul class="nav nav-pills nav-stacked">
@userGames.map { game =>
<li><a href="#" onclick="displayGameInfo(@game.id)">@game.title</a></li>
}
</ul>
</div>
...
<script>
var successFn = function(data) {
$('#gameInfo').html('');
$("#gameInfo").append('<h4>'+data.title+'</h4>')
}
var errorFn = function(err) {
console.debug("Error of ajax Call");
console.debug(err);
}
ajax1 = {
dataType: 'text',
contentType:'application/json',
success: successFn,
error: errorFn
}
var displayGameInfo = function(id) {
javascriptRoutes.controllers.GameController.loadGame(id)
.ajax(ajax1);
}
</script>
javascript ルートを持つ ApplicationController: ...
object Application extends Controller {
def javascriptRoutes = Action { implicit request =>
import routes.javascript._
println("-=== route ===-")
Ok(
Routes.javascriptRouter("javascriptRoutes")(routes.javascript.GameController.loadGame)
).as("text/javascript")
}
}
loadGame(id) メソッドを使用した GameController:
object GameController extends Controller {
...
// Library
def loadGame(id: Long) = Action(parse.json) { implicit request =>
println("-=== load game ===-")
val mess = Json.toJson(Game.find(id))
Ok(mess)
}
}
ゲームモデル:
case class Game(id: Long, title: String, description: String, userId: Long)
object Game {
val game = {
get[Long]("id") ~
get[String]("title") ~
get[String]("description") ~
get[Long]("userId") map {
case id~title~description~userId => Game(id, title, description, userId)
}
}
...
def find(id: Long): Game = DB.withConnection { implicit c =>
SQL("select * from game where id = {id}")
.on('id -> id).as(game *).head
}
implicit object GameFormat extends Format[Game] {
def reads(json: JsValue) = JsSuccess(Game(
(json \ "id").as[Long],
(json \ "title").as[String],
(json \ "description").as[String],
(json \ "uid").as[Long]
))
def writes(game: Game) = JsObject(Seq(
"id" -> JsNumber(game.id),
"title" -> JsString(game.title),
"description" -> JsString(game.description),
"userId" -> JsNumber(game.userId))
)
}
}