我有一个用于用户注册的域类。在注册过程中,用户需要输入两次电子邮件,这两者需要匹配。我不想存储重新输入的电子邮件,只是想将其用于验证。有什么建议吗?
我的域类看起来像:
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"/>
提前致谢
答案 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。