2010-05-05 [長年日記]

[Scala] play scala: controller, view 周りの調査メモ

ディレクトリ

app: アプリケーションのソースファイル
conf: 設定、ルーティング、カタログ、等のファイル置き場
lib: サードパーティーのjarファイル置き場 (自動的にclasspathに追加される)
public: js,css,imageなどの静的ファイル置き場
test: テストファイル置き場 (JUnit or Selenium)

サーバ起動

コマンド形式補足
play runforeground
play startbackground
play testforegroundenv=test

デフォルトは 9000 ポートなので、以下にアクセスして確認できる。

http://localhost:9000

ポートの設定は conf/application.conf の "http.port" で指定可能。

controllers

rails と違って、play ではコントローラはインスタンス化されない。アクションは全て static なクラスメソッドとして定義する。

アクション定義

static void index() { ... }

これは java 用の定義で、scala では単にメソッド定義するだけでよい

def index { ... }

アクションは return 構文を持たない。メソッドは render などの result メソッドが呼ばれた時点で終了する。(それが自然な気がする。何だったんだ DoubleRenderError)

パラメータ

params メソッドでパラメータオブジェクトを取得可能。

パラメータオブジェクト

クラスScope.Params
定義mvc/Scope.java
public String get(String key) {
public void put(String key, Object value) {

アクションメソッドの引数(シグネチャ)

クエリパラメータ(例えばid)は、

  params.get("id")

で取得できる。さらに、merbのようにアクションメソッドの引数に記述することもできる。つまり、

  def show() {
    val id = params.get("id")

ではなく、

  def show(id: String) {

と直接引数で受けることができる。(この意味で、rails より merb に似ている)。引数の順序は関係ない。このアクションメソッドの引数を、playでは「(アクションメソッドの)シグネチャ」と呼ぶ。

シグネチャの型変換

さらに、シグネチャの値は、変数の定義型によって(可能な限り)自動的にキャストされる。

int, long, boolean, char, byte, float, double, Integer, Long, Boolean, Char, String, Float, Double.

(以上は java の型。scala の場合は似たようなクラスで)

/hello/show?date=05-05-2010

というアクセスがあった場合、

  def show(date: Int) {
    date // => 0          // 変換失敗による Int のデフォルト値

  def show(date: Date) {
    date // => Wed May 05 00:00:00 JST 2010

となる。これは便利。

flashの設定

flash.error("Oops, plase enter your name!")

Viewテンプレート

Groovy テンプレートエンジンを利用。(ちょっと遅そう)。JSPタグライブラリに似た、独自の「playタグ」という形式で記述する。

#{ xxx /}

play タグの種類

#{extends 'foo.html' /}rails の部分テンプレートと同じ
#{doLayout /}rails の yield と同じ(親テンプレートで利用する)

動的なデータの埋め込み

テンプレート内では任意の式を実行させることはできない。これは、Groovy テンプレートエンジンの制約によるもの。式は評価できないが、テンプレート処理の前に設定したデータを動的に埋め込むことは可能。埋め込みデータの形式は Map(String->Object) な連想配列で、これをGroovyではBindingと呼んでいる。play では render メソッドの引数に Binding を渡すことができる。

controller

  var name = "guest"
  render(name)

template

  Name: ${ name }

変数の評価とデフォルト値

<h1>Hello ${myName ?: 'guest'}!</h1> 

'?:' は groovy で使われているデフォルト値を指定する演算子らしい。

url_for

Rails の url_for 的な url 名の解決には、"@{ ... }" を利用し、その中でコントローラクラスとアクションを指定する。

<a href="@{Application.index}">Top page</a> 

flashの参照

#{if flash.error}
 <p style="color:#c00">
   ${flash.error}
 </p>
#{/if} 

以下、親の敵のように調査中。


サイト内検索 (by Google)

| JRuby | Rails | Berryz | ℃-ute | エッグ | jQuery |

過去

2010年
5月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

未来

コンタクト