你如何让用户在 Grails 中更改域 class 中的值

How do you make the user change a value in the domain class in Grails

是否可以通过让用户输入新值来更改域 class 中的值? 所以如果我们有一个视图页面和一个输入框,输入框中输入的任何内容都会修改域中的特定值 class

例如:

class User {
    String userName
}

在浏览量页面中:

<input type="userName" action="changeUsername">

请采纳 Alidad 的建议:

Take a look at Grails scaffolding, it is a great resource to understand how Grails works.– Alidad

话虽如此,我们可以查看 运行 grails generate-all testapp.User 时生成的内容以及它与您的问题的关系。

生成所有基于您的域 class 用户创建控制器和视图。

package testapp

class User {

    String userName

    static constraints = {
        userName()
    }
}

注意静态约束(这是添加验证的好地方)但是要生成与特定值相关的视图和控制器,您只需将其添加到您的您域中的静态约束 class。

您希望能够更新域 class。 好吧,已经为我们生成了执行此操作的代码! 如果你看看 views/user/edit.gsp

<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>

这将创建一个表单来更新我们在本例中选择的当前用户 userInstance

另外一个重要的观察结果是 <g:form url="[resource:userInstance, action:'update']" method="PUT" > 这告诉我们将根据资源调用哪个控制器,将根据操作调用哪个方法 (您可以更多地了解良好的设计控制器在这里调用 Grails WebServices REST)

这将调用 controllers/testapp/UserController.groovy - 需要用户实例的更新

@Transactional
def update(User userInstance) {
        if (userInstance == null) {
            notFound()
            return
        }

        if (userInstance.hasErrors()) {
            respond userInstance.errors, view:'edit'
            return
        }

        userInstance.save flush:true

        request.withFormat {
            form multipartForm {
                flash.message = message(code: 'default.updated.message', args: [message(code: 'User.label', default: 'User'), userInstance.id])
                redirect userInstance
            }
            '*'{ respond userInstance, [status: OK] }
        }
    }

你可以看到它做了一些检查以确保实例存在并且没有错误(这是基于你在你的域中添加的验证 Class)然后保存你更新的用户实例和然后 returns 回了一条消息。将 "work" 移出您的控制器并移至服务 class 也是一个好习惯。

但是给猫剥皮有很多不同的方法。视图和控制器之间更新域 class 的通信可以通过许多不同的方式完成。

好吧,我希望这是有道理的,随便玩玩,玩得开心!