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

时间:2015-05-07 20:41:07

标签: grails

有没有办法通过让用户输入新值来更改域类中的值? 因此,如果我们有一个视图页面和一个输入框,输入框中输入的内容将修改域类中的特定值

例如:

ruby-prof

在观看页面中:

class User {
    String userName
}

1 个答案:

答案 0 :(得分:0)

请听阿丽达的建议:

  

看看Grails scaffolding,这是一个很好的资源   了解Grails的工作原理.- Alidad

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

generate-all创建一个基于您的域类User的Controller和Views。

package testapp

class User {

    String userName

    static constraints = {
        userName()
    }
}

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

您希望能够更新域类。 那么为我们生成了代码! 如果你看一下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" >这告诉我们将根据资源调用哪个控制器,并且将根据动作调用方法(您可以在此处查看控制器调用的优秀设计{ {3}})

这将调用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] }
        }
    }

您可以看到进行一些检查以确保实例存在且没有错误(基于您在域类中添加的验证)然后保存更新的用户实例,然后返回消息。将“工作”移出控制器并进入服务类也是一种很好的做法。

但是有很多不同的方法可以给猫皮肤涂抹。视图和控制器之间用于更新Domain类的通信可以通过许多不同方式完成。

嗯,我希望这是有道理的,只是玩耍,玩得开心!