gpt4 book ai didi

Grails 2.4.4 更新用户在点击后端代码之前自动保存用户

转载 作者:行者123 更新时间:2023-12-02 14:30:44 26 4
gpt4 key购买 nike

           <g:form url="[resource:userInstance, action:'update']" method="PUT" >
<g:hiddenField name="version" value="${userInstance?.version}" />
<fieldset class="form">
<g:render template="form"/>
</fieldset>
<fieldset class="buttons">
<g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" />
</fieldset>
</g:form>

有人能告诉我为什么当这到达后端代码时 def update(user userInstance) {} userInstance在我做之前已经保存了 userInstance.save() ???

最佳答案

这是 Grails 的一个隐藏功能,称为 。自动脏污检测 .每当您使用 .get() 获取和实例化时方法,自动脏污检测已启用,无需调用 .save() 即可保存您的实例即使其中一个字段已更新,也可以在其上:

class UserController {
def me() {
User user = User.get(1)
user.email = "newemail@example.com"
redirect action: "show"
}

def show() {}
}

上面的答案也证明了这一点。当您点击 URL /user/me , User自您的 email 起,域实例将使用新电子邮件进行更新字段很脏。要禁用此行为,您可以使用 read()方法而不是 get() .

http://grails.github.io/grails-doc/2.4.4/ref/Domain%20Classes/read.html

现在,您使用的将域实例引用为 Action 参数的特性,Grails 将尝试使用 id 查找域实例。请求的参数并使用 get()内部方法来获取实例。

如果请求是 POSTPUT请求然后它将所有传入的请求参数绑定(bind)到该域实例,因此再次 自动脏污检测将触发,即使您没有调用 .save(),您的域实例也会得到更新明确的方法。

要解决此问题,只需输入 @Transactional(readOnly = true)对您的操作进行注释,现在域实例将不会被保存,直到您明确调用 .save()域实例上的方法。

http://grails.github.io/grails-doc/2.5.0/guide/webServices.html#restControllersStepByStep

关于Grails 2.4.4 更新用户在点击后端代码之前自动保存用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32503852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com