有没有办法通过让用户输入新值来更改域类中的值? 因此,如果我们有一个视图页面和一个输入框,输入框中输入的内容将修改域类中的特定值
例如:
ruby-prof
在观看页面中:
class User {
String userName
}
答案 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类的通信可以通过许多不同方式完成。
嗯,我希望这是有道理的,只是玩耍,玩得开心!