代码改变世界

Go Web开发之Revel - 验证

2013-01-05 10:24  Danny.tian  阅读(2613)  评论(1编辑  收藏  举报

Revel提供内建的函数来验证参数.这里有一对部件:

  • 一个验证上下文收集器和消息验证错误(keys和消息)
  • 帮助函数检查数据并把错误信息加入上下文
  • 一个模板函数从验证上下的key获得错误信息

更深入的了解验证可以看一下 示例demo

内联错误信息

这个示例演示用内联错误信息验证字段.

func (c MyApp) SaveUser(username string) rev.Result {
    // Username (required) must be between 4 and 15 letters (inclusive).
    c.Validation.Required(username)
    c.Validation.MaxSize(username, 15)
    c.Validation.MinSize(username, 4)
    c.Validation.Match(username, regexp.MustCompile("^\\w*$"))

    if c.Validation.HasErrors() {
        // Store the validation errors in the flash context and redirect.
        c.Validation.Keep()
        c.FlashParams()
        return c.Redirect(Hotels.Settings)
    }

    // All the data checked out!
    ...
}

一步一步的:

  1. 在username上评估4个不同的条件(需要,最大值,最小值,匹配).
  2. 每一个评估返回一个ValidationResult.失败的ValidationResults存放在Validation上下文.
  3. 作为构建应用程序的一部分.Revel记录被验证的变量的名字并用它作为Validation上下文的缺省key (为了之后查询)
  4. Validation.HasErrors() 如果上下文是非空的返回true
  5. Validation.Keep() 告诉Revel序列化ValidationErrors到Flash cookie.
  6. Revel返回一个转向到Hotels.Settings action

Hotels.Settings aciton渲染一个模板:

{{/* app/views/Hotels/Settings.html */}}
...
{{if .errors}}Please fix errors marked below!{{end}}
...
<p class="{{if .errors.username}}error{{end}}">
    Username:
    <input name="username" value="{{.flash.username}}"/>
    <span class="error">{{.errors.username.Message}}</span>
</p>

它做了3件事:

  1. 检查errors字典的username看看是否这个字段有一个错误
  2. 用flash的参数值预填充input
  3. 在字段旁边显示错误提示信息(我们没有规定任何错误信息,但是每一个验证函数提供了一个默认的)

注意:字段模板帮助函数让使用验证错误框架写模板更方便一些.

顶部错误信息

如果错误信息被收集到一个地方,模板可以被简化(例如, 一个大的红色红框在页面的最上面)

这里和之前的示例只有两个不同

  1. 我们在ValidationError上规定一个消息来代替key
  2. 我们在表单的最上方打印全部的错误消息

下面是代码:

func (c MyApp) SaveUser(username string) rev.Result {
    // Username (required) must be between 4 and 15 letters (inclusive).
    c.Validation.Required(username).Message("Please enter a username")
    c.Validation.MaxSize(username, 15).Message("Username must be at most 15 characters long")
    c.Validation.MinSize(username, 4).Message("Username must be at least 4 characters long")
    c.Validation.Match(username, regexp.MustCompile("^\\w*$")).Message("Username must be all letters")

    if c.Validation.HasErrors() {
        // Store the validation errors in the flash context and redirect.
        c.Validation.Keep()
        c.FlashParams()
        return c.Redirect(Hotels.Settings)
    }

    // All the data checked out!
    ...
}

模板:

{{/* app/views/Hotels/Settings.html */}}
...
{{if .errors}}
<div class="error>
    <ul>
    {{range .errors}}
        <li> {{.Message}}
    {{end}}
    </ul>
</div>
{{end}}
...

 

 

至此结束.