0

環境: 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))
      )
  }
}
4

1 に答える 1

0

routesファイルでは、同じ URL に一致するルートを指定する必要があります。

# Library
GET     /library/:id                    controllers.UserController.library(id: Long)
GET     /library/:id                    controllers.GameController.loadGame(id: Long)

ブラウザが URL をリクエストすると、Play は宣言された順にルートを試行し、アクション/library/123を呼び出して最初のルートと一致します。controllers.UserController.library()これがおそらく、完全な HMTL ページを取得する理由です。

2 番目のルート (JSON を返すルート) に別の URL を定義してみてください。そうすれば、Play は正しいアクションに一致することができます。

元 :

GET     /library/:id                    controllers.UserController.library(id: Long)
GET     /gameData/:id                   controllers.GameController.loadGame(id: Long)
于 2013-06-05T19:04:23.233 に答える