我有一個註冊表單,其中包含與兩個域對象相關的字段;用戶和配置文件。該關係是用戶域類擁有的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
我添加以下邏輯來登記動作: – 2011-05-01 15:50:20
我本來由於用戶必須指定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
是的,你會的。那麼,我個人習慣於'render(view:'registration',model:[user:user])',而不是'redirect()' - 這將避免所有的參數傳遞。看起來'user'在'params'中變成了String,所以你必須使用'render()'。 – 2011-05-02 02:38:25