2

フィールド確認パスワードをユーザー登録フォームに追加しようとしています。これは私のドメイン クラスの抜粋です。

package usuario

class Usuario {

    transient springSecurityService

    String password
    String confirmarPassword

    static constraints = {

        password blank: false, password: true, size:5..15, matches:/[\S]+/
        confirmarPassword blank:false, password: true, size:5..15, matches:/[\S]+/, validator:{ val, obj ->
            if (obj.password != obj.confirmarPassword)
                return 'usuario.password.dontmatch'
        }

    }   

    static transients = ['confirmarPassword']

    static mapping = {
        password column: '`password`'
    }

    Set<Rol> getAuthorities() {
        UsuarioRol.findAllByUsuario(this).collect { it.rol } as Set
    }

    def beforeInsert() {
        encodePassword()
    }

    def beforeUpdate() {
        if (isDirty('password')) {
            encodePassword()
        }
    }

    protected void encodePassword() {
        password = springSecurityService.encodePassword(password)
    }
}

obj.confirmarPassword常に nullであるため、制約が達成されることはありません。

ここで提案されているように、Grails テンプレートをインストールしました。属性を変更しましたが、 _form.gsppersistentPropertiesのみで、_form.gspはGrails フィールド プラグインでは使用されません。したがって、transients 属性はインターネット ブラウザに表示されません。

_form.gsp の生成されたトランジェント属性を create.gsp にコピーしました。

<fieldset>
    <g:form class="form-horizontal" action="create" >

        <div class="fieldcontain ${hasErrors(bean: usuarioInstance, field: 'confirmarPassword', 'error')} required">
            <label for="confirmarPassword">
                <g:message code="usuario.confirmarPassword.label" default="Confirmar Password" />
                <span class="required-indicator">*</span>
            </label>
            <g:field type="password" name="confirmarPassword" maxlength="15" pattern="${usuarioInstance.constraints.confirmarPassword.matches}" required="" value="${usuarioInstance?.confirmarPassword}"/>
        </div>

        <fieldset>          
            <f:all bean="usuarioInstance"/>
            <div class="form-actions">
                <button type="submit" class="btn btn-primary">
                    <i class="icon-ok icon-white"></i>
                    <g:message code="default.button.create.label" default="Create" />
                </button>
            </div>
        </fieldset>
    </g:form>
</fieldset>

トランジェント属性が画面に表示されますが、obj.confirmarPasswordまだnullです

私が考えた最後のアプローチは、views_fields\default_field.gspを変更して、これらのトランジェント属性も使用することですが、方法がわかりませんでした。これはドキュメントです。これはそのファイルの内容です:

<%@ page defaultCodec="html" %>
<div class="control-group ${invalid ? 'error' : ''}">
    <label class="control-label" for="${property}">${label}</label>
    <div class="controls">
        <%= widget %>
        <g:if test="${invalid}"><span class="help-inline">${errors.join('<br>')}</span></g:if>
    </div>
</div>

Grails Fields Pluginで可能ですか? クライアント側またはサーバー側のどこで条件がテストされますか? (チェックの一部はクライアント側にあると思いますが、すべての制限はサーバー側で再度チェックされます)。

4

2 に答える 2

1

ああ、私は以前に遭遇したことがあります。

宣言する

        String confirmarPassword

それをtranisetにすると、このようには機能しません

        static transients = ['confirmarPassword']

しかし

        transient  confirmarPassword 

あなたがspringServiceのためにそれをしたように...なぜそれがうまくいかないのか、これはわかりません.

于 2013-08-21T13:19:40.710 に答える
1

Grails の最新バージョンでは、一時属性はデフォルトでフォームにバインドされていません。これはバインド可能な制約のドキュメントです。これは私のコードがどのようになるかです(私はちょうど追加しましたbindable: true):

static constraints = {

    password blank: false, password: true, size:5..15, matches:/[\S]+/
    confirmarPassword bindable: true, blank:false, password: true, size:5..15, matches:/[\S]+/, validator:{ val, obj ->
        if (obj.password != obj.confirmarPassword)
            return 'usuario.password.dontmatch'
    }
}

ただし、一時的な属性は で表示されません。<f:all bean="usuarioInstance"/>これらの属性を手動で追加する必要があります: <f:field bean="${usuarioInstance}" property="confirmarPassword" />。これは理想的なソリューションではありません。誰かが答えを知っていることを期待して、この質問を開いたままにしておきます。

アップデート

私の場合、Spring Security Core プラグインを使用しているため、上記のソリューションも機能しませんでした。次のエラーが発生します。

usuario.Usuario エントリの null id (例外が発生した後にセッションをフラッシュしないでください)

その場合、コマンド オブジェクトを使用する必要があります。この問題については、この投稿で説明 (および解決) されています。

于 2013-08-20T23:14:59.613 に答える