如何在视图页面中更改域 class 的值

How do I change a value of a domain class in view page

我有一个管理域 class,我正在尝试更改它的变量 pass,因为它被设置为默认值 admin123

当我阅读 Grails 文档时,我了解到 remoteField 它可以更改域 class 中的值,但是当我在文本字段中输入新值并单击时没有任何反应输入。

这是我的管理域 class,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]  
}

如果您查看 the docsremoteField,您会看到它在更改时发送一个事件。当此更改时,它会将值发布到操作 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!
}

编辑

来自文档。

This tag creates an input field that fires an AJAX request when its value changes (typically when the user presses return inside the field).

当用户在字段内点击回车键或值发生变化时,将触发该事件。不需要提交按钮。这不会提交任何内容。这是一个 AJAX POST.