我有一个管理域类,我正在尝试更改其变量pass
,因为它已设置为默认值admin123
当我阅读Grails文档时,我读到remoteField
它可以更改域类中的值,但是当我在文本字段中输入新值并单击回车时没有任何反应。
以下是我的管理域类,其中pass
为变量,changePassword
为应在remoteField
class Admin {
String pass = "admin123"
static constraints = {
pass size: 5..15, blank: false
}
def changePassword() {
def a = new Admin()
a.pass = params.value
a.save()
}
}
这是changePassword.gsp,它允许管理员更改密码
<h5>Your old password is "${oldPass}"</h5>
<h3>Please input your new password</h3>
<g:remoteField action="changePassword" name="pass" value="${admin?.pass}" />
这是显示changePassword
oldPass
的管理控制器方法
def changePassword = {
def admin = new Admin()
def oldPass = admin.pass
[oldPass: oldPass]
}
答案 0 :(得分:1)
如果您查看remoteField
的{{3}},您会看到它在更改时发送了一个事件。如果更改,则会将值发布到操作changePassword
。在changePassword
中,默认参数名称为value
。所以像..
def admin = Admin.get(params.id);
admin.pass = params.value;
admin.save(flush: true, failOnError: true);
这将保存管理对象。
注意强>
您正在以纯文本格式保存密码。不要这样做。您应该在存储之前对密码进行哈希处理。为此,您可以在域对象中添加beforeInsert
事件挂钩。
def beforeInsert() {
this.pass = // You can work this out. Hash the password!
}
修改强>
来自文档。
此标记创建一个输入字段,当其值发生变化时触发AJAX请求(通常是当用户在字段内按下返回时)。
当用户点击字段内部或值发生变化时,会触发该事件。不需要提交按钮。这不提交任何内容。这是一个AJAX POST。