sohatach's blog

http://github.com/soha

Skinny Frameworkを使ってみる。その3

前回まででリクエストを受け付けてからの一連の流れが大体理解できました。

まず見るべきは、Controllers.scalaRailsで言うところのroutes.rb相当)であり、
ここから各URLに対応する処理が記載されています。

val indexUrl = get("/companies")(showResources).as('index)

上記の例では、companyの一覧を表示する画面の定義ですが、
「/companies」にアクセスがあると「showResources」というメソッドが呼ばれます。
「showResources」の具体的な処理は、CompaniesController.scalaに以下の通り定義されています。

  protected def enablePagination = true

...

  def showResources = {
    if (enablePagination) {
      val pageNo: Int = params.getAs[Int]("page").getOrElse(1)
      val pageSize: Int = 20
      val totalCount: Long = Company.count()
      val totalPages: Int = (totalCount / pageSize).toInt + (if (totalCount % pageSize == 0) 0 else 1)
      set("items", Company.findAllWithPagination(Pagination.page(pageNo).per(pageSize)))
      set("totalPages" -> totalPages)
    } else {
      set("items", Company.findAll())
    }
    render(s"/companies/index")
  }

この中の

val pageNo: Int = params.getAs[Int]("page").getOrElse(1)

リクエストからのパラメータの取り方は、上記のようになるようです。
実際に
/companies/?page=3
などとアクセスするとデータ件数によっては、一覧に1件も表示されなくなりました。
ちなみにここでは、「.getOrElse(1)」としているため、Intにできないような文字が渡ってきた際は、
こちらが呼ばれ、pageNoは、1となるようです。

Scaffoldのその先へ

Controllerの作りが大体わかってきたところで、
今回やりたいことは、EventとMemberの紐付けなので、
EventのIDとMemberのIDを紐付ける画面を作成して、
params.getAsして両者のIDをDBに保存してやればよさそうです。
scaffoldから先のやり方が少し見えてきました。

EventにMemberが参加するJoin画面を以下の通り作りました。

skinny g controller join

何が生成されたかは、こちらを見た方が早いかと思います。
https://github.com/soha/atumeru/commit/4777d8dcf9f0f796cd2dd604134efadefac1051a

skinny-framework-exampleの
https://github.com/skinny-framework/skinny-framework-example/blob/master/src/main/scala/controller/CompaniesController.scala
https://github.com/skinny-framework/skinny-framework-example/blob/master/src/main/webapp/WEB-INF/views/companies/index.html.ssp
を参考にEvent一覧画面を作成しました。(Memberを紐付けるための画面)
https://github.com/soha/atumeru/commit/92db7fd3aa708b2b88635e5385b9f4ab78a6d971

skinny-framework-exampleの方では、問題ないようですが、
4777d8dcf9f0f796cd2dd604134efadefac1051aにて生成したControllers.scalaの修正では、
ページング用のURLが適切でないようでしたので、修正しました。
https://github.com/soha/atumeru/commit/292e292b52b49978faca24b7d51725a37ea8b8ef
自動生成されたものをそのまま使用すると
/join/??page=2
などのように?が2つ生成されてしまっていたようです。

まだEvent一覧が表示されるだけで、肝心のMemberとの紐付け画面ができていませんが、
今日はここまで。