2008年2月9日土曜日

Grailsに触る その2

前回のエントリでGrailsのInstallと動作確認をした。そこで、以下の簡単なアプリを作るとした。

  • メンバ管理
  • メンバにぶら下がるタスク管理
まずはそれぞれのModelを作る必要がある。それぞれ「Member」「Task」というClassにする。
  1. まずはMemberClassを作成する。以下のコマンドを実行する。
    $ grails create-domain-class Member
  2. 以下の2行が含まれたメッセージが表示される。
    Created for Member ... Created Tests for Member
    なんかTestCaseの雛形も一緒に出してくれるっぽい。Railsもこぅなんだろぅな。
  3. 生成された「grails-app/domain/Member.groovy」を編集する。
    class Member {
      Long id
      String name
      String password
    }
    Groovyがわかってないので見よう見まねで作っただけ。
  4. 次にTask…ではなく、まずはWebAppとして動作させたいためControllerを作成することにする。以下のコマンドを実行する。
    $ grails create-controller Member
  5. 以下の2行が含まれたメッセージが表示される。
    Created Controller for Member ... Created ControllerTests for Member
    これまたTestCaseの雛形も一緒に出してくれる。いいですね。
  6. 生成された「grails-app/controllers/MemberController.groovy」を以下のように編集する。
    class MemberController {
       def scaffold = Member
    }
    生成された時には「def index = { }」があったけど、それを「def scaffold = Member」に置き換えただけ。これを書いておくと、viewを勝手に生成してくれるよぅだ。scaffoldだし。
  7. この状態で、$ grails run-app する。
  8. 起動が完了したら、ブラウザから「http://localhost:8080/studyGrails/member」を開く。すると「http://localhost:8080/studyGrails/member/list」にリダイレクトされて、空っぽのMember一覧が表示される。
  9. ここで[New Member]をClickすると「http://localhost:8080/studyGrails/member/create」へリダイレクトされ、Memberの編集画面となる。idフィールドが無いということは自動生成するフィールドとして自動で認識されている、といぅ事か。適当にnameとpasswordを入力して[create]ボタンをClickする。
  10. 「http://localhost:8080/studyGrails/member/show/1」へリダイレクトされる。なんかRESTっぽいURLの指定だ。再び「http://localhost:8080/studyGrails/member」を開いて見ると、listへリダイレクトされて入力したデータが表示されている事が確認できる。
次に、Taskを追加する。基本的にはMemberと同じ事をやるだけなので、端折って書く。
  1. $ grails create-domain-class Task
    $ grails create-controller Task
  2. Modelであるgrails-app/domain/Task.groovyは以下のように編集する。
    class Task {
        Member member
        Long id
        String name
    }
    Memberへの関連をmember_idではなく、MemberClassのオブジェクトとして定義する。ちょっとJavaっぽい。
  3. ただし、関連の設定はMember側にも必要なのでgrails-app/domain/MemberにhasManyの関係を指示するために以下の一行を追加する。
    static hasMany = [tasks:Task]
    あんまりJavaっぽくない。てっきり「List tasks」みたいな書き方を想像したのに。けど、なんかおもしろい指定方法だな。
  4. Controllerであるgrails-app/controllers/TaskController,groovyはさっきと同じようにscaffoldになんとかしてもらう。
    class TaskController {
        def scaffold = Task
    }
  5. この状態で再び$ grails run-appして、「http://localhost:8080/studyGrails/member」を開く。
  6. さっき実行したときに入力したデータが消えている。orz デフォルトで使用されるHSQLDBは毎回作成されるモードが適用されているよぅだ。めげずにまたデータを入力して、Memberを登録した後の一覧画面で確認する。そこから「id」フィールドの値をClickするとMemberの詳細表示画面へ遷移する。
  7. そこで[Edit]をClickすると編集画面へ遷移するが、「Tasks」フィールドに「Add Task」のLinkが存在している。これは想像通り、Taskを追加する画面へ遷移するLinkで、もちろんTaskの追加ができる。
  8. ただし!Taskの登録画面には遷移するものの、元々のMemberのidまでは引き継がれていない。Memberの選択はComboBoxとなっているのは、Model作成時にちゃんと関連を設定しているからだが、ちょっと残念。
色々問題はあるにせよ、Grailsではこんなカンジで作成していくよぅだ。
  • scaffoldを素で使用しているだけでは実用的なアプリは絶対無理。
となると、GSPというJSPのGroovy版を触っていくことになるが、それ以前にGroovyがわかってない自分には敷居が高そうだ。たぶんGrailsは使わないだろぅと思った。だが、ControllerのTestClassとかも生成されていたりするし、ControllerのTest方法が気になる。何かの参考になるかもしれんのでGrailsのTest機能も試しておく必要ありそうだ。忘れないうちに「GrailsのControllerのTestがどーなってんのか試してみる」というTaskを追加しておいた。 でも、コマンドプロンプトでctrl+c押すとgrailsが止まってMemberデータもTaskデータも消えちゃぅんですけどね。

コメントを投稿