2012-05-11 10 views
2

私はユーザー登録のためのドメインクラスを持っています。登録中、ユーザーは電子メールを2回入力する必要があり、その2つは一致する必要があります。私は再入力された電子メールを保管しておき、それを検証のために使用したいだけではありません。なにか提案を?Grailsはメールの再入力を確認します

マイドメインクラスは、次のようになります。

class MyUser{ 

    String name 
    String email 
    Integer telephone 
} 

と私の見解は次のようになります。事前に

<label for="reEmail" id="reEmail"> 
<g:message code="myUser.reEnter.label" default="Re-enter Email:" id="reEnter"/></label> 
<g:textField name="reEmail"/> 

おかげ

答えて

2

これを処理するための良い方法を使用することですあなたのクラスのtransientフィールド。そのよう

....その後

class MyUser{ 

    static constraints = { 
     email (email: true, blank: false) //<-- just a good idea ;) 
    } 

    String name 
    String email 
    Integer telephone 
    String emailAgain 
    static transients = ['emailAgain'] //<-- won't be stored in the database 

} 

、あなたはただ、他の同じようフィールドを扱うことができますビューに...
<g:textField name="email" /> 
<g:textField name="emailAgain" /> 

は、それからちょうどあなたのコントローラでそれを検証します。 ..

def save = { 
    def myUser = new MyUser(params); 
    if (myUser.email.equals(myUser.emailAgain)){ //<-- maybe make a helper method in the domain class (myUser.doesEmailMatchEmailAgain() ?) 
    // do stuff 
    }else{ 
    //handle error, tell user their email's don't match 
    } 
} 
+0

ありがとうございました。私のドメインクラスで "emailAgain"を定義したくない場合はどうすればよいですか? jQueryのようなものを使ってこれを処理する方法はありますか? – grailsDev

+0

もちろん、これをJQueryで行うこともできますが、実際にはこれを処理する方法がいくつかあります。これは「標準的な」グレイルにうまく収まる1つの提案です。あまりにも多くのビジネスロジックを目に見えるように注意してください。ビューは表示する必要があります。 –

+0

は@MichaelJ.Leeのようなものですが、いくつかの方法があります.1つは、クライアント上でフォームの送信を処理することです。サーバー側の電話をかける前に、2つの電子メールを比較して一致するかどうかを警告することができます。それ以外の方法は、2番目の電子メールでfocusoutイベントを処理し、2つの電子メールを比較するjQueryコードを起動することです。これが役に立ちます。 – allthenutsandbolts

0

私はこれを数回行った。最初はコントローラで検証を行っていましたが、これをクリーンアップし、クライアント側でjqueryで電子メール検証を終了しました。

この方法では、一致しない電子メールの周りを行き来する必要はありません。

メールが有効かどうかを確認するためのサンプルJavaScript関数です。これで、最初に入力したものをもう一度確認するだけです。

2番目のメールには、フォームに別のフィールドパラメータが必要です。

// simple function to check if a email is of a valid email type 
function IsEmail(email) { 
    var regex = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; 
    return regex.test(email); 
} 

// method to check if email and confermation email is the same. 

$("#signupForm").validate({ 
rules: { 
       ...snip... 
    email1: { 
     required: true, 
     minlength: 5 
    }, 
    email2: { 
     required: true, 
     minlength: 5, 
     equalTo: "#email1" 
    }, 
       ...snip... 
}, 
messages: { 
    ...snip... 
    email: { 
     required: "Please provide a email", 
     minlength: "Your email must be at least 5 characters long" 
    }, 
    email2: { 
     required: "Please provide a confermation email", 
     minlength: "Your confermation email must be at least 5 characters long", 
     equalTo: "Please enter the same email as above" 
    }, 
    ...snip... 
} 

});

+0

ありがとうございますが、これは電子メールの形式を検証するためのものだと思います。私は、自分のユーザーに入力された2つの電子メールが互いに一致しているかどうかを確認する必要があります。 – grailsDev

+0

あなたが探しているものをさらに含めるように更新しました –

1

もう1つのオプションは、Command Objectsを使用することです。彼らはあなたのフォームポストを(ドメインクラスのように)制約やカスタムバリデーションを持つことができる単一のオブジェクトとして戻すことのメリットをもたらします。その後、ユーザーの入力に満足すれば、コマンドオブジェクトの値でドメインオブジェクトを更新できます。

コマンドオブジェクトは、いくつかの場所に送信されるフォームの種類がある場合に非常に便利です(ユーザーの登録と更新は、2つのフォームが類似しているためコマンドオブジェクトを再利用できる例です)。または、複数のドメインオブジェクトを更新するフォームがページにある場合、またはフォームが1:1をドメインオブジェクトにマップしていない場合。

私はそれをどれだけうまく説明したのかよく分かりませんが、知りたいことはよくあります。あなたのユースケースでは過度のものかもしれませんが。

このページでは例パスワードを2回取って、それを比較することがあります。http://www.intelligrape.com/blog/2009/05/26/command-objects/

0

電子メール確認がそうであるならば、私はあなたが完全にサーバー側でそれを忘れることができると思います。それは決して悪意のある攻撃者を阻止することはないので、あなたの言うとおり、あなたのドメインクラスの場所として価値のあるものではありません。再入力するだけで間違ったユーザーを助けるので、クライアントサイドのjavascriptでやってみると良いでしょう。

こうして、私は単純にjQuery validation pluginのようなソリューションを使うことができると思います。グラス特有のものは何もない、私は恐れている。

working demoもあります。

関連する問題