Enviar búsqueda
Cargar
Grails超入門
•
0 recomendaciones
•
389 vistas
I
ikufumi sato
Seguir
Grailsで爆速Webアプリ開発を始めるためのチュートリアルです。ToDoメモアプリで、GrailsによるWebアプリ開発の基本を押さえます。
Leer menos
Leer más
Software
Denunciar
Compartir
Denunciar
Compartir
1 de 29
Descargar ahora
Descargar para leer sin conexión
Recomendados
【修士論文】CNNを用いた定置網漁場におけるマグロ有無の推定に関する研究
【修士論文】CNNを用いた定置網漁場におけるマグロ有無の推定に関する研究
harmonylab
Cartographer を用いた 3D SLAM
Cartographer を用いた 3D SLAM
Yoshitaka HARA
RvizPlugin作成入門
RvizPlugin作成入門
Sho Takahashi
第3回WBAレクチャー:BRAに基づく海馬体の確率的生成モデルの構築
第3回WBAレクチャー:BRAに基づく海馬体の確率的生成モデルの構築
The Whole Brain Architecture Initiative
NEDO講座 MoveIt! チュートリアル 第1部
NEDO講座 MoveIt! チュートリアル 第1部
openrtm
AIシステムの要求とプロジェクトマネジメント-後半:機械学習応用システムのための要求工学と安全性
AIシステムの要求とプロジェクトマネジメント-後半:機械学習応用システムのための要求工学と安全性
Nobukazu Yoshioka
[DL輪読会]YOLO9000: Better, Faster, Stronger
[DL輪読会]YOLO9000: Better, Faster, Stronger
Deep Learning JP
tf,tf2完全理解
tf,tf2完全理解
Koji Terada
Recomendados
【修士論文】CNNを用いた定置網漁場におけるマグロ有無の推定に関する研究
【修士論文】CNNを用いた定置網漁場におけるマグロ有無の推定に関する研究
harmonylab
Cartographer を用いた 3D SLAM
Cartographer を用いた 3D SLAM
Yoshitaka HARA
RvizPlugin作成入門
RvizPlugin作成入門
Sho Takahashi
第3回WBAレクチャー:BRAに基づく海馬体の確率的生成モデルの構築
第3回WBAレクチャー:BRAに基づく海馬体の確率的生成モデルの構築
The Whole Brain Architecture Initiative
NEDO講座 MoveIt! チュートリアル 第1部
NEDO講座 MoveIt! チュートリアル 第1部
openrtm
AIシステムの要求とプロジェクトマネジメント-後半:機械学習応用システムのための要求工学と安全性
AIシステムの要求とプロジェクトマネジメント-後半:機械学習応用システムのための要求工学と安全性
Nobukazu Yoshioka
[DL輪読会]YOLO9000: Better, Faster, Stronger
[DL輪読会]YOLO9000: Better, Faster, Stronger
Deep Learning JP
tf,tf2完全理解
tf,tf2完全理解
Koji Terada
Moveitを使ったアプリケーションの紹介
Moveitを使ったアプリケーションの紹介
Ryodo Tanaka
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
Kitsukawa Yuki
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
Hideki Takase
Unityでロボットの教師データは作れる!
Unityでロボットの教師データは作れる!
UnityTechnologiesJapan002
20190307 visualslam summary
20190307 visualslam summary
Takuya Minagawa
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。
ROBOTIS Japan
20170419PFNオープンハウス インターンと採用 公開用
20170419PFNオープンハウス インターンと採用 公開用
Preferred Networks
Devsumi 2021 MLOps for Self-driving car
Devsumi 2021 MLOps for Self-driving car
yusuke shibui
SSII2018TS: 3D物体検出とロボットビジョンへの応用
SSII2018TS: 3D物体検出とロボットビジョンへの応用
SSII
AlphaGoのしくみ
AlphaGoのしくみ
Hiroyuki Yoshida
Github Actionsで始めるROS/ROS2のCI
Github Actionsで始めるROS/ROS2のCI
Atsuki Yokota
230420_東工大授業「ロボット技術」資料.pdf
230420_東工大授業「ロボット技術」資料.pdf
NoriakiAndo
音楽を見る:情報可視化技術の音楽情報処理への適用
音楽を見る:情報可視化技術の音楽情報処理への適用
Takayuki Itoh
ロボティクスにおける SLAM 手法と実用化例
ロボティクスにおける SLAM 手法と実用化例
Yoshitaka HARA
ROS の活用による屋外の歩行者空間に適応した自律移動ロボットの開発
ROS の活用による屋外の歩行者空間に適応した自律移動ロボットの開発
Yoshitaka HARA
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜
Tatsuya Fukuta
第六回全日本コンピュータビジョン勉強会資料 UniT (旧題: Transformer is all you need)
第六回全日本コンピュータビジョン勉強会資料 UniT (旧題: Transformer is all you need)
Yasunori Ozaki
NetworkXによる語彙ネットワークの可視化
NetworkXによる語彙ネットワークの可視化
Shintaro Takemura
CV分野におけるサーベイ方法
CV分野におけるサーベイ方法
Hirokatsu Kataoka
RAFT: Recurrent All-Pairs Field Transforms for Optical Flow
RAFT: Recurrent All-Pairs Field Transforms for Optical Flow
MasanoriSuganuma
1019 まぁ!簡単!google apps script入門
1019 まぁ!簡単!google apps script入門
Tatsuya Kosuge
Androidアプリ開発で活躍必至!? ビルドツールGradle
Androidアプリ開発で活躍必至!? ビルドツールGradle
amayaw9
Más contenido relacionado
La actualidad más candente
Moveitを使ったアプリケーションの紹介
Moveitを使ったアプリケーションの紹介
Ryodo Tanaka
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
Kitsukawa Yuki
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
Hideki Takase
Unityでロボットの教師データは作れる!
Unityでロボットの教師データは作れる!
UnityTechnologiesJapan002
20190307 visualslam summary
20190307 visualslam summary
Takuya Minagawa
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。
ROBOTIS Japan
20170419PFNオープンハウス インターンと採用 公開用
20170419PFNオープンハウス インターンと採用 公開用
Preferred Networks
Devsumi 2021 MLOps for Self-driving car
Devsumi 2021 MLOps for Self-driving car
yusuke shibui
SSII2018TS: 3D物体検出とロボットビジョンへの応用
SSII2018TS: 3D物体検出とロボットビジョンへの応用
SSII
AlphaGoのしくみ
AlphaGoのしくみ
Hiroyuki Yoshida
Github Actionsで始めるROS/ROS2のCI
Github Actionsで始めるROS/ROS2のCI
Atsuki Yokota
230420_東工大授業「ロボット技術」資料.pdf
230420_東工大授業「ロボット技術」資料.pdf
NoriakiAndo
音楽を見る:情報可視化技術の音楽情報処理への適用
音楽を見る:情報可視化技術の音楽情報処理への適用
Takayuki Itoh
ロボティクスにおける SLAM 手法と実用化例
ロボティクスにおける SLAM 手法と実用化例
Yoshitaka HARA
ROS の活用による屋外の歩行者空間に適応した自律移動ロボットの開発
ROS の活用による屋外の歩行者空間に適応した自律移動ロボットの開発
Yoshitaka HARA
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜
Tatsuya Fukuta
第六回全日本コンピュータビジョン勉強会資料 UniT (旧題: Transformer is all you need)
第六回全日本コンピュータビジョン勉強会資料 UniT (旧題: Transformer is all you need)
Yasunori Ozaki
NetworkXによる語彙ネットワークの可視化
NetworkXによる語彙ネットワークの可視化
Shintaro Takemura
CV分野におけるサーベイ方法
CV分野におけるサーベイ方法
Hirokatsu Kataoka
RAFT: Recurrent All-Pairs Field Transforms for Optical Flow
RAFT: Recurrent All-Pairs Field Transforms for Optical Flow
MasanoriSuganuma
La actualidad más candente
(20)
Moveitを使ったアプリケーションの紹介
Moveitを使ったアプリケーションの紹介
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
Unityでロボットの教師データは作れる!
Unityでロボットの教師データは作れる!
20190307 visualslam summary
20190307 visualslam summary
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。
20170419PFNオープンハウス インターンと採用 公開用
20170419PFNオープンハウス インターンと採用 公開用
Devsumi 2021 MLOps for Self-driving car
Devsumi 2021 MLOps for Self-driving car
SSII2018TS: 3D物体検出とロボットビジョンへの応用
SSII2018TS: 3D物体検出とロボットビジョンへの応用
AlphaGoのしくみ
AlphaGoのしくみ
Github Actionsで始めるROS/ROS2のCI
Github Actionsで始めるROS/ROS2のCI
230420_東工大授業「ロボット技術」資料.pdf
230420_東工大授業「ロボット技術」資料.pdf
音楽を見る:情報可視化技術の音楽情報処理への適用
音楽を見る:情報可視化技術の音楽情報処理への適用
ロボティクスにおける SLAM 手法と実用化例
ロボティクスにおける SLAM 手法と実用化例
ROS の活用による屋外の歩行者空間に適応した自律移動ロボットの開発
ROS の活用による屋外の歩行者空間に適応した自律移動ロボットの開発
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜
第六回全日本コンピュータビジョン勉強会資料 UniT (旧題: Transformer is all you need)
第六回全日本コンピュータビジョン勉強会資料 UniT (旧題: Transformer is all you need)
NetworkXによる語彙ネットワークの可視化
NetworkXによる語彙ネットワークの可視化
CV分野におけるサーベイ方法
CV分野におけるサーベイ方法
RAFT: Recurrent All-Pairs Field Transforms for Optical Flow
RAFT: Recurrent All-Pairs Field Transforms for Optical Flow
Similar a Grails超入門
1019 まぁ!簡単!google apps script入門
1019 まぁ!簡単!google apps script入門
Tatsuya Kosuge
Androidアプリ開発で活躍必至!? ビルドツールGradle
Androidアプリ開発で活躍必至!? ビルドツールGradle
amayaw9
golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)
Yuichi Murata
クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法
クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法
Hiroki Yata
cochica
cochica
Hiroki Yoshida
Glide活用イメージ紹介20220421
Glide活用イメージ紹介20220421
kazu_1803
01 slack導入の提案
01 slack導入の提案
ssuser68dea4
The Internal of Serverless Plugins
The Internal of Serverless Plugins
Terui Masashi
Serverless on GCP
Serverless on GCP
Hayato Yoshikawa
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
Yuji Nojima
DDDをScrumで廻す あるいは ScrumをDDDで廻す
DDDをScrumで廻す あるいは ScrumをDDDで廻す
Kiro Harada
Google Product
Google Product
Daisuke Sugai
Similar a Grails超入門
(12)
1019 まぁ!簡単!google apps script入門
1019 まぁ!簡単!google apps script入門
Androidアプリ開発で活躍必至!? ビルドツールGradle
Androidアプリ開発で活躍必至!? ビルドツールGradle
golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)
クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法
クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法
cochica
cochica
Glide活用イメージ紹介20220421
Glide活用イメージ紹介20220421
01 slack導入の提案
01 slack導入の提案
The Internal of Serverless Plugins
The Internal of Serverless Plugins
Serverless on GCP
Serverless on GCP
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
DDDをScrumで廻す あるいは ScrumをDDDで廻す
DDDをScrumで廻す あるいは ScrumをDDDで廻す
Google Product
Google Product
Grails超入門
1.
Grails超入門チュートリアル WebApp爆速開発できるまでのポイント
2.
Grailsの入門でつまづきやすいポイント Grailsで、アプリを開発しようとすると、チュートリアルが古い。 サンプルプログラムはGrailsの爆速なところが生かし切れて いない。例えば、respondなどはかなり便利ですが、他のフ レームワークにもみられるようなrenderばかりが、使われてい るものもあります。
肝心なオフィシャルドキュメントも、読み込まないとGrailsの爆 速なところが生かされない。機能が豊富で、ついつい他のフ レームワークのような冗長な書き方をしてしまいがち。 これからGrailsを始める人が、はまらないように、ポイントがま とまっていない。 サンプルアプリが散在していて、簡単にHelloWorldまで行け るが、カスタムしようとすると、???となる。 GSPはすごいのに、単純なviewとして流されている。
3.
お断り このチュートリアルは、Grailsの基本性能を理解するため に作られています。バリデーションやエラー処理、テスト を含む、実際の運営では欠かせない部分は、入門の内 容のため、含まれていませんので、ご了承ください。 スライドの見栄えのバランスを整えるためにスペースの 幅をずらしています。コードを写す場合は、注意をお願い します。
用語の使用方法で、専門用語の代わりに平易な言葉が 使われている部分があります。厳密な解釈から部分的 に逸脱がある場合があります。
4.
このスライドの中身は? Grailsを使用してToDoアプリ(やることメモリスト)を作成 します。 Grailsの強みを引き出しながら、開発の肝となるGrailsの ポイントを押さえます。
Grails3.3.6を基準にしています。 DBはMySQLを使用します。 JAVA8を使用します。
5.
フレームワークのダウンロード 適当なフォルダに移動します $cd /grailsをインストールしたいフォルダパス
Grailsフレームワークをダウンロードします $sudo wget https://github.com/grails/grails-core/releases/download/v3.3.6/grails-3.3.6.zip 解凍します $sudo unzip grails-3.3.6.zip demoという名前のWebAppを作成します $sudo ./grails-3.3.6/bin/grails create-app demo これで現在のディレクトリにdemoという名前のフォルダが作成されているはずです。
6.
基本的な開発の手順 ※以降、コマンドとソースコードの記述では小文字と大文字の違いに注意してください。 以下のような流れでチュートリアルを進めます。 1.
環境設定を行います。 2. データベースに保存するデータをdomainとして定義します。 3. Webアクセスに対する処理をcontrollerに書いていきます。 4. viewにHTMLを生成する処理を書いていきます。 5. 必要に応じてcontrollerとviewを編集します。 ※Linux、MySQL、JAVA8JDKのインストールと設定は、済んでいるものとします。
7.
データベースの準備 MySQLにgrailsという空のデータベースを作成してくださ い。 エンコードはutf8-binなどutf8系にしてください。
以降の設定ではDataBaseの名前をgrailsとして設定を 行っていきます。もちろん何でもいいので、変更した場合 は、以降の説明で出てくる環境設定を書き換えることを お忘れななく。 Grailsはテーブルを自動生成してくれます。DBさえ作って しまえば、あとはMySQLを操作する必要は激減します。
8.
環境設定 下記のファイルを編集してください。エディタの指定は今回は行いません。 /demo/build.graidle 51行目付近 変更前:runtime
"com.h2database:h2“ 変更後:runtime “mysql:mysql-connector-java:8.0.11” 上記では8.0.11のmysql-connectorを使用していますが、最新バージョンは下記のURLで確認 できます。 https://mvnrepository.com/artifact/mysql/mysql-connector-java
9.
環境設定 /demo/grails-app/conf/application.yml 91行目付近とそれ以降 削除:driverClassName: org.h2.Driver
ただ削除してください。grails-3.3.5から自動付与されるため、mysqlの場合、 driverClassName: com.mysql.cj.jdbc.Driver と書かなく良くなりました。 変更:username: mysqlのユーザネーム 変更:password: ‘mysqlのパスワード’ 変更前: url:jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FAL SE 変更後: url: jdbc:mysql://localhost:3306/grails?useSSL=false&requireSSL=false&characterEncoding=utf8 このurl:は3か所あります。3か所とも変更してください。ここでgrailsと書かれている部分が実 際のDB名になります。独自に名前を変更した場合はここを変えてください。
10.
環境設定(おまけ) Grailsでは、Tomcatというアプリケーションサーバがセットになっているフルスタックフレーム ワークです。これはとても便利で、例えばソースコード一部を変更した場合、自動リロードが 行われ、わざわざ、再コンパイル、ビルド、サーバの再起動を行わずに、即座に変更が反映 されます。JAVA関係のフレームワークとしては画期的です。 しかし、開発環境によっては、すでにTomcatがインストールされていることもあるでしょう。そ の場合ポート番号がかぶってしまいますので、ポート番号を変更します。
/demo/grails-app/conf/application.yml 追記: --- server: port: 8081 --- application.ymlファイルでは、「---」ハイフン3つは区切り記号として、使用できます。 文字の先頭をずらす場合、ymlファイルではタブは禁止ですので、スペースを入れてください。
11.
いったん実行してみよう ここまで設定が終わったら、いったん実行してみましょう。 demoフォルダ内へ移動します。 $cd
/demoフォルダがあるパス/demo Grailsが作成したアプリケーションフォルダにはgrailsのラッパーであるgrailswが入っています。 ここでは、demoフォルダの中に初めから入っている、grailswを使用します。 アプリケーションを実行します。 $sudo ./grailsw run-app 初めての実行の場合、依存関係にあるパッケージのダウンロードが行われます。 少し時間がかかりますので待ちましょう。 しばらくすると、最後に8081ポート(先ほど設定おまけで追記していなければ、通常8080)で アプリが実行されていると表示されると思います。 例: Grails application running at http://localhost:8081 ブラウザから http://localhost:8081 へアクセスしてみましょう。コントローラへのリンクがあります。
12.
コマンドライン補足 アプリケーションの実行が確認出来たら、アプリケーションサーバを止める場合は、 「Ctrl+C」を押してください。コマンドラインに戻ることができます。 補足!
Ubuntuで開発を行っている方は、grailsのコマンドを実行した後に、コマンドラインで BackSpaceキーを押すと「^H」と表示されてしまうことがあります。その場合は以下のコマンド を実行すると、元に戻すことができます。 $stty erase ^H ←この^HはそのままBackSpaceキーを押して表示させます。
13.
ドメイン それでは、実際に開発をはじめましょう。 今回作るアプリは「やること(ToDo)メモ」です。データベースにはtodoという名前のテーブル を作成してmemoという名前のデータを格納するようにしましょう。
以降の開発用のコマンドは、すべてdemoフォルダ内からgrailswを呼び出しているとします。 $sudo ./grailsw create-domain-class todo コードの編集 /demo/grails-app/domain/demo/Todo.groovy package demo class Todo { String memo //これを追記memoというデータを定義します static constraints = { } } idの定義は自動で行われますので必要ありません。
14.
コントローラ コントローラはWebアクセスに対して応答し、実際に処理を振り分ける役割をします。 コントローラの作成 $sudo
./grailsw create-controller todo 今回のチュートリアルでは、使いませんが、Grailsにはgenerate-allという強力なコマンドもあり ます。特定のドメインクラスに対して、そのドメインクラスのデータを一覧、作成、表示、編集、 削除(CRUD)できる、コントローラ、ビューのセットを一発で自動生成します。例えば今回の todoドメインクラスでは次のようになります。 $sudo ./grailsw generate-all todo generate-allしてアプリを実行(run-app)すると、簡単にデータベースにアクセスしデータを管 理できるアプリが完成しているのがわかると思います。初めてGrailsのフレームワークの便 利さを体験してみるには、一度、generate-allも試してみてください。 しかし、フレームワークを使うのが初めてで、自動生成された膨大なコードを元に、編集する のは、混乱を招くと思います。チュートリアルでは、コントローラを単体で作成して、コードを 書いていきます。それでもGrailsは簡単ですし、練習のための最小のコードを知ることができ ると思います。
15.
コントローラ 作成されたコントローラを編集しましょう /demo/grails-app/contoller/demo/TodoController.groovy package
demo import grails.validation.ValidationException //追記 import static org.springframework.http.HttpStatus.* //追記 class TodoController { def index() { //ここで定義される関数をアクションといいます respond Todo.list() //追記 } } ここですごいのはrespondです。respond Todo.list()と書くと、Todoドメインのデータの一覧が データベースから作成され、決められた規則により、todoListという名前でviewへ渡されます。 viewは指定がなければ、コントローラと同名のフォルダ内でアクションと同名のファイルが自 動で使われます。Grailsではほとんどが自動で行われるため、一覧を作成するためのコント ローラの記述も1行で終わりです。
16.
ビュー それでは、viewファイルを作成しましょう。viewは実際にブラウザに渡されるHTMLデータを 定義します。 すでにコントローラを作成した時点で同名のフォルダが自動で作成されていますので、そこ にビューファイルを作成します。
/demo/grails-app/views/todo フォルダにアクション名と同名で拡張子が.gspのファイルを作成 してください。今回はindex.gspです。以下のように記述してください。通常のHTMLと似ていま す。見栄えを良くするため、とりあえず既定のcssを含むlayoutを<meta>タグで指定します。 /demo/grails-app/views/todo/index.gsp <html> <head> <meta name="layout" content="main" /> <title>やることメモ</title> </head> <body> </body> </html>
17.
ビュー それでは、実際にデータの一覧が表示できるようにviewを編集します。 /demo/grails-app/views/todo/index.gsp <body> <ul> <g:each
in=“${todoList}”> <li>${it.memo}</li> </g:each> </ul> </body> <body>タグの間にメモの一覧がリスト表示されるようにします。gspファイルでは<g:>タグで 様々な処理を行えます。これもGrailsが強力なところです。コントローラから受け取ったリスト を<g:findAll>で再処理することもできるため、DBへの負担の軽減とviewへのデータの受け渡 しが極めて容易になります。 <g:each>内で使われている${it}は、リストからeachで分割された一つのデータを表す予約語 です。${it.memo}でtodoドメインで定義されたmemoデータにアクセスできます。 ここでのGarilsの特徴はtodoListが空かどうかの判定がいらない点です。
18.
新しいデータを追加する フォームから新しいメモを投稿して、データベースに登録してみましょう。 gspには、フォーム生成のための専用のタグ<g:form>があります。
gspには、フォームからサブミットされたデータを自動的に、ドメインと結び付けてくれるため、 一つ一つのパラメータを受け取る処理をcontrollerに書く必要はありません。 それでは、コントローラとviewを編集しましょう。 /demo/grails-app/controllers/TodoController.groovy def index(){ respond Todo.list() respond new Todo() //追記 } まず、フォームから投稿されるデータが格納されることになるTodoドメインをnewで生成します。 respondは、一つのアクションの中で複数使用することができます。 これにより、viewとの連携がGrailsではとても簡単です。renderと同時使用はできません。 フォームの自動生成と、値とモデルの紐づけが、きわめて簡単でタグの自由度も高いです。
19.
フォームを生成 続いてviewを編集します。 /demo/grails-app/views/todo/index.gsp <g:each
in=${todoList}> (先ほど追加したeachのコード) </g:each> 先ほど追加したg:eachの下に下記を追記してください。 <g:form resource=“${this.todo}” action=“save” method=“POST”> <fieldset class="form"> <g:hiddenField name="id" value="${this.todo.id}" /> <f:field bean=“todo” property=“memo” label=“メモ"/> </fieldset> <fieldset class="buttons"> <g:submitButton name=“create” class=“save” value=“保存” /> </fieldset> </g:form>
20.
フォームとドメインクラス resourceに${this.コントローラ}とactionを指定することで、リンクが自動生成されます。 <f:field>はGrails
Fields Pluginにより提供される機能です。このプラグインは標準でロードされ るPluginです。 <f:filed> では、 bean=“コントローラでnewしたドメインクラス” property=“値を紐づけるドメインクラスの値” label=“インプットフィールドのラベル” を指定することで、ドメインに関連した値を送信することができるフィールドを生成します。 beanで、ドメインクラスを指定することで、サブミットされた値が自動的にドメインに格納されま す。そのため、Grailsでは、サブミットされた値をコントローラで受け取り、それをわざわざパラ メータとして個別に処理したり、SQLに代入するといった作業がまったく必要ありません。 idはGrailsで自動割り振りを任せているので、ユーザが指定する必要はないため、非表示と しています。<g:hiddenField name="id" value="${this.person.id}" />
21.
フォームの値をコントローラで受取る viewの<g:form>で指定したように、フォームのサブミットボタンが押されると、TodoController のsaveアクションが呼び出されます。コントローラにsaveアクションを定義しましょう。 /demo/grails-app/controllers/demo/TodoController.groovy class
TodoController { def index(){省略} //これ以降を追記 def save(Todo todo){ todo.save(flush: true) redirect(controller:“todo", action: "index") } //←ここまで } saveアクションの1行目でtodo.save()があります。基本的には1行で、フォームから投稿された 値をデータベースに保存するのは終わりです。そのため、フォームからサブミットされた値を 個別に受け取ったり、SQLに代入したりする処理は全くありません。1行で終わりです。その 後、todoの内容を一覧するためindexアクションにリダイレクトします。 ここまで出来たらいったんアプリを実行してみましょう。 $sudo ./grailsw run-app
22.
リダイレクトもGrailsはすごい さて、ここまでで、メモを保存して一覧するアプリができました。 先ほどは単純にリダイレクトしましたが、実際はリダイレクトするときに、「保存が成功した」な どのメッセージを含めたいことがあるでしょう。ここでもGrailsはすごいんです。
他のフレームワークでは、リダイレクトする際に、変数としてメッセージなどを含める場合、リ ダイレクト先のindexアクションでもその値を受け取れるように、パラメータの受け取り処理を 追加する必要があります。 よくあることですが、indexアクションは、直接ブラウザからアクセスされる場合と、リダイレクト でアクセスされる場合が出てきます。そのため、パラメータが空の場合を考える必要があり ます。(リダイレクトの時だけ値が入るパラメータが出てくる。) すると、indexアクションにはパラメータの状態をチェックする処理を追記することになります。 そしてフレームワークによっては、viewでエラーを出さないために、ニセの値を格納する必要 がある場合もあります。つまり、ちょっと面倒くさいのです。 Grailsならindexアクションは全く変更する必要ありません。リダイレクトで増えた値について、 まったくindexアクションで触れる必要はありません。にもかかわらず、メッセージなどの新し い値をindexアクションを経由してview(index.gsp)に表示できます。indexアクションが飛ばさ れているわけではなく、indexアクションで定義されたrespondも機能します。
23.
リダイレクトにメッセージを含める /demo/grails-app/controllers/demo/TodoController.groovy def save(Todo
todo){ todo.save() redirect(controller:“todo", action: "index") } を次のように変更します。 def save(Todo todo){ todo.save() request.withFormat { form multipartForm { flash.message = message(code: 'default.created.message', args: [‘メモ’, todo.memo]) redirect(controller:“todo", action: "index") } } } 詳細は割愛しますが、 ‘default.created.message‘とは、標準のメッセージでi18n対応です。
24.
ビューを変更する /demo/grails-app/views/todo/index.gsp 先ほどのForm生成タグの上にメッセージを表示させるためのタグを追加しましょう。
リダイレクト以外ではメッセージはnullですので、<g:if>タグで判定します。 <g:if>タグ内のtestとは、if判定をするための決まった予約語です。 <g:each 略> (略) </g:each> <g:if test="${flash.message}"> <div class="message" role="status">${flash.message}</div> </g:if> <g:form 略> (略) </g:form>
25.
メモを削除できるようにする ToDoメモを不要になったら削除できる機能を追加しましょう。 まず、それぞれのメモの横に「削除」リンクを追加しましょう。
<g:each>の部分を編集します。たった1行です。 /demo/grails-app/views/todo/index.gsp <ul> <g:each in=“${todoList}”> <li>${it.memo} <g:link action=“delete” id=“${it.id}”>削除</g:link> //追記 </li> </g:each> </ul> <g:if 略> </g:if> <g:form 略> </g:form> deleteアクションにmemoのidを渡します。id=“”とするだけです。
26.
削除の機能を実装する controllerに削除の機能を実装します。deleteアクションを追加します。 /demo/grails-app/contollers/demo/TodoController.groovy class
TodoController { def index() { (略) } def delete(Long id){ def todo = Todo.get(id) todo.delete(flush: true) request.withFormat { form multipartForm { flash.message = message(code: 'default.deleted.message', args: [‘メモ’, todo.memo]) redirect(controller:“todo", action: "index") } } viewとcontrollerの間でidの受け渡しが簡単でパラメータから切り出す必要もありません。
27.
メモを編集できるようにする ToDoメモを編集できるようにします。先ほどフォームからコントローラへ投稿された値を、保 存するのはやりました。しかし、編集するとなると、すでに保存された値をフォームに戻すこと になります。ここでもGrailsは超簡単です。フレームワークによっては、コントローラからフォー ムに値を渡すのは、フォームデータを保存する時よりコードの量が多くなります。 viewに「編集」リンクを追加します。
/demo/grails-app/views/todo/index.gsp <ul> <g:each in=“${todoList}”> <li>${it.memo} <g:link action=“delete” id=“${it.id}”>削除</g:link> <g:link action=“edit” id=“${it.id}”>編集</g:link> //追記 </li> </g:each> </ul> 編集機能を追加するわけですから、「編集」リンクを追記するのは、分かりやすいですね。 しかし、<g:form>タグは全く変更しません。Grailsならそれでいいのです。他のフレームワーク だったら、「もしフォームに値が渡されたらフィールドにその値をセットして…」とか大変です。
28.
編集の機能を実装する コントローラに編集の機能を追加します。editアクションを追加します。 /demo/grails-app/contollers/demo/TodoController.groovy class
TodoController { def index() { (略) } def delete(Long id){ } def edit(Long id){ respond Todo.list() respond Todo.get(id), view: “index” } } じゃーん。これだけです。本当に驚きです。 respondは、viewを指定できます。指定しなければアクションと同名のファイルが使用されま すが、ここでは、index.gspを使用したいので、view: “index” とします。
29.
まとめ ここまでGrailsを見てきましたが、いかにGrailsが優れた フレームワークであるか、ご覧いただけたかと思います。 JAVAとGroovyのいいとこどりで、JAVAの経験を生かせる ことも、もちろんですが、実は、Groovyの特徴を生かせる ことも大きなメリットがあります。
それでは、Grailsをお楽しみください。
Descargar ahora