水曜日, 5月 09, 2007

Grails0.5.5-SNAPSHOT 検証...

Grails0.5.5-SNAPSHOT 検証...
T.Yamamotoのブログにあったgrails0.5の新機能をざっくりと検証してみました。(翻訳GoodJob!)


URLマッピング



conf フォルダにある [YourApplicationName]UrlMapping.groovy というファイルに設定する。
ただし、標準のままでは web.xml から読込んだサーブレットなどが動作しなくなってしまう。

以下の方法で回避可能
class LabeltestUrlMappings {
 static mappings = {
  "/ui/$controller/$action?/$id?"{     ← /ui を追加
   constraints {
    // apply constraints here
   }
  }
 }
}

これにより、自動生成されるURLが変更され、他のサーブレットに影響を与えなくなる。

http://localhost:8080/book/list
 ↓↓↓
http://localhost:8080/ui/book/list

createLink等で生成されるURLは自動的に /ui 付きに置き換わるので気にしないでOK
ただし index.gsp のコントローラーのリンクリストは違う方法でリンクしてるので注意
index.gsp内を以下のように修正すればモウマンタイ(何故か変換出来ない)


<div class="dialog" style="margin-left:20px;width:60%;">
 <ul>
  <g:each var="c" in="${grailsApplication.controllerClasses}">
   <li class="controller"><a href="ui/${c.logicalPropertyName}">${c.fullName}</a></li>   ← href 部分に ui/ 追加
  </g:each>
 </ul>
</div>

マッピングの定義は以下のようにする

class [YourApplicationName]UrlMappings {
 static mappings = {
  // /ui/book/show/1 -> /ktkr/nu-n/1
  "/ktkr/nu-n/$id?" {
   controller = "book"
   action = "show"
  }

  // /ui/book/edit/1 -> /ktkr/na-n/1
  "/ktkr/na-n/$id" {
   controller = "book"
   action = "edit"
  }

  // これを指定しておくと、指定されてないマッピングを今までどうりのルールでアクセスできる //
  "/ui/$controller/$action?/$id?"{
   constraints {
  }
 }
}
}

Controller部分のみを変更すると一部動作しなかった、、、Actionまでちゃんと区切った方がよさそう

CommandObject



フォームからのパラメーターにバリデーションがかけられる
src/groovy か controllers フォルダにファイルを作成する。(src/groovy はなんか挙動があやしいので controllers にいれてテスト)

class BookCommand {
 String title
 String mail

 static constraints = {
 title(blank:false,nullable:false,minSize:5,maxSize:10)
  mail(email:true)
 }
}

class BookController {
 def test = { BookCommand cmd ->
  if(cmd.hasErrors()) {
   println "error"
  } else {
   println "ok"
  }
 }
}

book/testへアクセスした時にBookCommandのバリデーションをかけられる。
上記の例だと以下の結果になる
/book/test? ×
/book/test?title= ×
/book/test?title=a ×
/book/test?title=hogehoge ○
/book/test?title=hogehoge&mail=noemail ×
/book/test?title=hogehoge&mail=email@address.jp ○

Plugin



インストール時、アップグレード時に自動実行してくれる Script が追加された。
プラグインの Scripts フォルダに _Install.groovy , _Upgrade.groovy を置くだけ。中身は GANT で記述
2007/5/9 Executing xxx plugin post-install script ... のメッセージは出たが実行されてないもよう

GORM - List Map



List

static hasMany = [books:Book]
List books

今まで hasMany だけだと Set できてたけど、List でかいてやると List で来る

Map

Map hoge

普通に hasMany っぽいテーブルが出来る
テーブルが出来るのはちょっとやだなぁ、、、

GORM - Embedded



one-to-one の関係をテーブル的に一つにまとめられる機能

class Book {
 static embedded = ['saleMaker','modMaker']

 String title
 String author

 Maker saleMaker
 Maker modMaker

 static constraints = {
  modMaker(nullable:true)
 }
}

2007/5/9 テーブルはちゃんと作られる バリデーション等も機能するが、保存時(実際にDBへ書き込みにいく時)に以下のエラーが出る
Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

Base64 エンコーディング



.encodeAsBase64() でエンコードされる
文字列、数値、日付、なんでもエンコード出来た


新機能はなかなかうまくいきませんね、早く安定版になってほしいです