1

2 つのドメイン オブジェクトに関連するフィールドを含む登録フォームがあります。ユーザーとプロファイル。この関係は、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>

構文的には、すべて問題ないように見えます。値にアクセスするために適切な命名規則とグレイルの補間を使用しているので、これが期待どおりに動作しない理由については、私は機知に富んでいます。

コメントや提案をいただければ幸いです。

ありがとう、トム

4

3 に答える 3

0

明示的にerorrを呼び出してみますか?

私はこのパターンを使用して、同じフォームにリダイレクトしました。

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

私は通常、Webフローでコマンドオブジェクトを使用するため、通常のパターンは次のようになります。

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

}
于 2011-05-02T02:18:41.893 に答える
0

送信された値を何らかの方法でin actionからuserin action に渡す必要があります。このような:registeruserregistration

if (params.user) {
  user.properties = params.user.properties
}
于 2011-05-01T15:16:08.413 に答える
0

私の記憶が正しければ、次の行にあるものだと思いました。

def user = new User()
user.properties = params
于 2011-05-01T14:50:30.587 に答える