Grails验证电子邮件重新输入

时间:2012-05-11 14:59:50

标签: validation grails gsp

我有一个用于用户注册的域类。在注册过程中,用户需要输入两次电子邮件,这两者需要匹配。我不想存储重新输入的电子邮件,只是想将其用于验证。有什么建议吗?

我的域类看起来像:

class MyUser{

    String name
    String email
    Integer telephone
 }

我的观点如下:               

<label for="reEmail" id="reEmail">
<g:message code="myUser.reEnter.label" default="Re-enter Email:" id="reEnter"/></label>
<g:textField name="reEmail"/>

提前致谢

4 个答案:

答案 0 :(得分:2)

处理此问题的一个好方法是在班级中使用transient字段。

喜欢这样......

class MyUser{

    static constraints = {
      email (email: true, blank: false) //<-- just a good idea ;)
    }

    String name
    String email
    Integer telephone
    String emailAgain
    static transients = ['emailAgain'] //<-- won't be stored in the database

 }

然后,在你看来,你可以像其他任何人一样处理这个领域......

<g:textField name="email" />
<g:textField name="emailAgain" />

然后在控制器中验证它......

def save = {
   def myUser = new MyUser(params);
   if (myUser.email.equals(myUser.emailAgain)){ //<-- maybe make a helper method in the domain class (myUser.doesEmailMatchEmailAgain() ?)
     // do stuff
   }else{
     //handle error, tell user their email's don't match
   }
}

答案 1 :(得分:1)

另一种选择是使用 Command Objects 。它们为您提供了将表单帖子作为单个对象返回的好处,该对象可以具有约束和自定义验证(就像域类一样)。然后,一旦您对用户的输入感到满意,就可以使用命令对象的值更新域对象。

当您拥有在几个地方提交的表单类型时,命令对象非常有用(想想用户注册和更新用户详细信息是2个表单相似的示例,因此您可以重用命令对象)。或者当您的页面上有表单更新多个域对象或表单只是不能很好地将1:1映射到域对象。

不确定我解释得有多好,但他们很了解。虽然它们在您的用例中可能有些过分。

此页面有一个密码输入两次并进行比较的示例:http://www.intelligrape.com/blog/2009/05/26/command-objects/

答案 2 :(得分:0)

我做了几次不同的事情。第一个是在控制器中进行验证,但我清理了它并结束了在客户端的jquery中进行电子邮件验证。

通过这种方式,您无需为了不匹配的电子邮件进行全程旅行。

这是一个示例javascript函数,用于检查电子邮件是否有效。现在你所要做的就是在输入的第一个中再次验证它。

您只需在表单中为第二封电子邮件添加另一个字段参数。

// simple function to check if a email is of a valid email type
function IsEmail(email) {
  var regex = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  return regex.test(email);
}

// method to check if email and confermation email is the same.

 $("#signupForm").validate({
rules: {
                ...snip... 
    email1: {
        required: true,
        minlength: 5
    },
    email2: {
        required: true,
        minlength: 5,
        equalTo: "#email1"
    },
               ...snip...
},
messages: {
    ...snip...
    email: {
        required: "Please provide a email",
        minlength: "Your email must be at least 5 characters long"
    },
    email2: {
        required: "Please provide a confermation email",
        minlength: "Your confermation email must be at least 5 characters long",
        equalTo: "Please enter the same email as above"
    },
    ...snip...
}

});

答案 3 :(得分:0)

如果确实是电子邮件确认,我认为您可以在服务器端完全忘记它。它永远不会阻止恶意攻击者,正如你所说,它在你的域类中是不值得的。重新进入只会帮助误解用户,所以我认为在客户端使用javascript做这件事已经足够了。

通过这种方式,我认为你可以简单地使用像jQuery validation plugin这样的解决方案。没什么特别是grails,我很害怕。

您还可以在此处找到working demo