読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

Backbone.js と jquery.tmpl.js ではまったメモ

日記 html5 jquery

今日は、Play2.0 に https://github.com/aselab/scala-activerecord 突っ込んで、Backbone.js 使って、Caffee Script に直そうとしてたのだが全然進まなんだ、、、。

まず、scala-active record を Play2.0 に取り込む手順をど忘れ。かれこれ2ヶ月 sbt 使ってないから、何処に何書くんだっけ?状態。

まずはメモ。Project/Build.scala に以下の設定を記載。

object ApplicationBuild extends Build {

    val appName         = "study_caffee"
    val appVersion      = "1.0-SNAPSHOT"

    val appDependencies = Seq(
      // Add your project dependencies here,
      "com.github.aselab" % "scala-activerecord" % "0.1",
      "postgresql" % "postgresql" % "9.1-901.jdbc4"
    )

    val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
      // Add your own project settings here
      resolvers += ("aselab repo" at "http://aselab.github.com/maven/")
    )

}

で、公式に書いてある意外に、Play2.0 の DB から接続設定引っこ抜いて使おうと思って、まずは Play2.0 側から、Connection の引っこ抜き方を調べる。

これはそんなに苦労はしなかった。
http://www.playframework.org/documentation/2.0.2/ScalaDatabase

が、この引っこ抜いた Connection を食わせる口が scala-activerecord の Wiki に見当たらず、ソースコードを延々読むこと 3h 。使うのは楽だけど、作るのはやばい、リフレクションとジェネリクスだらけで何処呼んでるかわからなくなってくる。
中でやってることを理解しようという、当初の目的から外れることに。
挙げ句、サンプル(Sample project)の中にやりたいことが入ってることに気づく。
とりあえずこれで Play2.0 アプリにおいて scala-activerecord が使えることに。

テーブル作って(作らなくても勝手に用意してくれるけど)、

create table todo_user (
  id serial,
  name varchar(32) not null,
  password varchar(128) not null,
  primary key(id)
);

モデル定義

case class User(var name: String, var password: String) extends ActiveRecord

object User extends ActiveRecordCompanion[User]

接続やらなにやら

object Tables extends ActiveRecordTables {

  val users = table[models.tables.User]("todo_user")

  lazy val playConfig = current.configuration
  /* 略 */
}

ここまで来たら後は JSON 化まで楽勝。
コントローラ作って

/* 略 */
import com.github.aselab.activerecord._
import play.api.libs.json._
import com.codahale.jerkson.Json._

object Users extends Controller {

  def getAll = Action {
    val allusers = models.tables.User.all.toList
    Ok(generate(allusers.map(u => u:Map[String, Any])))
  }

  implicit def convertUserToJson(user:models.tables.User):Map[String, Any] = {
    Map(
      "id" -> user.id,
      "name" -> user.name
    )
  }
}

ルーティングに定義するだけ。

# Map json api
GET     /rest/user                  controllers.rest.Users.getAll

そしたらその後 Backbone.js 初プレイ。
参考資料は

で、ことのついでにテンプレートも使おうかと欲を出したのが運の尽き。
ライブラリはここ https://github.com/jquery/jquery-tmpl
ひたすら以下のエラーで2h 位はまった。

$("#template").tmpl is not a function

食った原因が2つあって、

  1. 1.0 beta 以前のものは、html5 の DOCTYPE 食わすとエラーを吐いて、テンプレート化できない。
  2. jquery.tmpl.js の読み込みはテンプレート記述の後でなければならない(知らずにHTML上で、下に定義を置いてたら、永久にテンプレートが読み込まれません。てか読み込みロジック位$(function)で書こうぜと思わなくない)

今日はここで力つき。