Revelでページを追加してフォーム送信
Revelでページを追加してフォーム送信
app/views/App/Index.html を編集してフォームを追加してみる
フォームの追加場所はflash.htmlをincludeしてる場所の下へ
code:app/views/App/Index.html
<!-- 省略 -->
<div class="container">
<div class="row">
<div class="span6">
{{template "flash.html" .}}
<form action="/App/Hello" method="GET">
<input type="text" name="myName" /><br/>
<input type="submit" value="Say hello!" />
</form>
</div>
</div>
</div>
<!-- 省略 -->
ブラウザをリロードしたらフォームが生えたので、適当なデータを入れてsubmitしてみると
Not Foundという画面に遷移する。あきらかなエラー
action="/App/Hello"に紐づくメソッドが存在しないため起きて当然
追加してみる
code:app/controllers/app.go
package controllers
import (
"github.com/revel/revel"
)
type App struct {
*revel.Controller
}
func (c App) Index() revel.Result {
greeting := "こんにちは"
foobar := "fooooooooooo"
return c.Render(greeting, foobar)
}
// とりあえずここだけ追加してみた
// formでname=myNameになっているので、引数もそれに合わせる必要がある
func (c App) Hello(myName string) revel.Result {
return c.Render(myName)
}
リロードしてsubmitしてみる
まだエラー
No matching route found: /App/Hello?myName=aaaaaa
1. App.Helloに紐づくテンプレートが存在しないから
2. conf/routesにルーティングを追加していないから
テンプレートを追加
code:app/views/App/Hello.html
{{set . "title" "Hello page"}}
{{template "header.html" .}}
<h1>Hello {{.myName}}</h1>
<a href="/">Back to form</a>
{{template "footer.html" .}}
この時点でもまだエラー
ルーティング追加
code:conf/routes
GET / App.Index
GET /App/Hello App.Hello
まだエラー
サーバを再起動してみたら反映された
conf/routesの変更は反映されないのだろうか?
バリデーションを追加してみる
myNameは必須
最低でも3文字は必要
というバリデーション
code:app/controllers/app.go
package controllers
import (
"github.com/revel/revel"
)
type App struct {
*revel.Controller
}
func (c App) Index() revel.Result {
greeting := "こんにちは"
foobar := "fooooooooooo"
return c.Render(greeting, foobar)
}
func (c App) Hello(myName string) revel.Result {
c.Validation.Required(myName).Message("名前必須ですよ")
c.Validation.MinSize(myName, 3).Message("最低でも3文字は必要ですよ")
// バリデーションに問題があれば、Indexページにリダイレクトさせる
if c.Validation.HasErrors() {
c.Validation.Keep()
c.FlashParams()
return c.Redirect(App.Index)
}
return c.Render(myName)
}
入力空でsubmit
名前必須ですよ
入力aでsubmit
最低でも3文字は必要ですよ
入力abcでsubmit
hello
エラーメッセージを埋め込むテンプレートはapp/views/flash.htmlっぽい