フィールド確認パスワードをユーザー登録フォームに追加しようとしています。これは私のドメイン クラスの抜粋です。
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で可能ですか? クライアント側またはサーバー側のどこで条件がテストされますか? (チェックの一部はクライアント側にあると思いますが、すべての制限はサーバー側で再度チェックされます)。