Grails表单错误处理:绑定1:1对象映射

问题描述:

我有一个注册表单,其中包含与两个域对象相关的字段;用户和配置文件。该关系是用户域类拥有的1:1映射。Grails表单错误处理:绑定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的插值来处理值,所以我很好地结束了为什么这不符合预期。

任何意见或建议,将不胜感激。

感谢, -Tom

如果我没有记错我认为这是东西的线路:

def user = new User() 
user.properties = params 

您需要在register行动某种方式传递来自user提交值userregistration行动。像这样:

if (params.user) { 
    user.properties = params.user.properties 
} 
+0

我添加以下逻辑来登记动作: – 2011-05-01 15:50:20

+0

我本来由于用户必须指定user.properties两次已经在注册行动中进行编组。无论如何,我已将此添加到登记:'DEF登记= { \t \t如果(params.user){ \t \t \t DEF用户= params.user \t \t \t返回[用户:用户] \t \t} \t} '。但是,我现在为用户?.profile?。firstname获得了'No Such Property Found:profile'错误。 – 2011-05-01 15:59:28

+0

是的,你会的。那么,我个人习惯于'render(view:'registration',model:[user:user])',而不是'redirect()' - 这将避免所有的参数传递。看起来'user'在'params'中变成了String,所以你必须使用'render()'。 – 2011-05-02 02:38:25

尝试明确调用erorr?

我一直使用这种模式重定向回到相同的形式。

if (user.save()) { 
... 
} else { 
    return error() 
} 

我通常使用在webflows命令对象,所以我的正常模式如下:

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() }) 
    } 

}