2011-05-01 74 views
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

回答

0

如果我沒有記錯我認爲這是東西的線路:

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

您需要在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

0

嘗試明確調用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() }) 
    } 

}