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

时间:2015-05-07 19:51:58

标签: grails

我有一个管理域类,我正在尝试更改其变量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]  
}

1 个答案:

答案 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。