我有一个注册表单,其中包含与两个域对象相关的字段;用户和个人资料。该关系是User域类拥有的1:1映射。
用户控制器上的“注册”操作会封送表单值,并且如果没有验证错误,则会在提交表单时保留用户对象并重定向到应用程序根目录。否则,控制器将重定向回到显示具有失败值的预填充字段的注册表单。
但是,实际上,当验证失败时,视图中不会显示失败的值。以下是注册操作的代码:
def registration = {
}
def register = {
def user = new User()
bindData(user, params)
if (user.save()) {
flash.message = 'Successfully Registered User'
redirect(uri: '/')
}else {
flash.message = 'Registration Failed!'
redirect(action: registration, params: [ user: user ])
}
}
以下是显示用户和个人资料相关字段的视图中的示例html摘录:
<div class="row">
<label for="city"> City, State: </label>
<g:textField id="city" name="profile.city"
value="${user?.profile?.city}" size="28" />
<span class="red">*</span>
</div>
<hr />
<div class="row">
<label for="email"> E-mail address: </label>
<g:textField id="email" name="userId" value="${user?.userId}" size="28" />
<span class="red">*</span>
</div>
从语法上讲,外翻看起来还不错;我正在使用适当的命名约定和grail的插值来获取值,所以我最终知道为什么这不符合预期。
任何意见或建议将不胜感激。
谢谢, - 汤姆
答案 0 :(得分:0)
如果我没记错的话,我认为这就是:
def user = new User()
user.properties = params
答案 1 :(得分:0)
您需要以某种方式将user
行动中的register
提交的值传递给user
行动中的registration
。像这样:
if (params.user) {
user.properties = params.user.properties
}
答案 2 :(得分:0)
尝试显式调用erorr?
我一直在使用此模式重定向回相同的表单。
if (user.save()) {
...
} else {
return error()
}
我通常在webflow中使用命令对象,所以我的正常模式如下:
def registerFlow = {
registerPage = {
on("submit") { FormDataCommand cmd ->
cmd.validate()
if (cmd.hasErrors()) {
flow.cmd = cmd
return error()
} else {
...
}
}
}
}
class FormDataCommand implements Serializable {
User u
Profile p
static constraints = {
u(validator: { it.validate() })
p(validator: { it.validate() })
}
}