我对Grails很新,所以请原谅我,我想做的事对其他人来说可能非常明显。它将帮助我理解Grails以及底层魔法是如何工作的(或不起作用)。答案必须是Groovy / Grails,没有javascript,因为我了解javascript是如何工作的。
说我有文件:
User.groovy
UserController.groovy
我正在使用脚手架来CRUD USER表中的记录。现在我想稍微调整一下。
在档案 User.groovy :
class User {
String name
static constraints = {
name blank: false
}
}
我想 UserController.groovy (这是我应该编辑的文件吗?)检查提交的用户名是否为Bill,然后自动将用户名替换为William,然后继续在数据库中创建记录。
在网络表单中,我输入名称字段:Bill并单击“提交”
更新数据库后,我检查记录,用户名应该是USER表数据库中的William。
问题#1(基本)我该怎么做?
现在有点麻烦了,如果在db#1中创建了William记录后,我想连接到另一个db#2并在那里的USER表中插入William?
所以当我点击SUBMIT一次时,两个记录几乎会同时插入两个不同的数据库中?此操作将执行的操作是在db#1中插入记录,然后连接到db#2,然后以串行方式执行相同的插入。
问题#2(中级)我在哪里查看Grails文件夹/文件以修改此操作行为?
答案 0 :(得分:2)
您必须创建与您的控制器关联的视图。在该视图中,您必须创建表单,以便用户输入用户名,如下所示:
<g:form controller="user" action="save">
<g:textField name="username"/>
<g:submitButton name="save" value="save"/>
</g:form>
现在,当用户对表单进行求和时,将调用用户控制器的保存操作。传递给控制器操作的所有参数都保存在params
映射中。因此,在您的保存操作中,您可以像这样访问username
:
def save = {
def user = new User(username: params.username)
// OR
def user = new User(params)
// you can change username like so
user.username = "William"
user.save()
}
这是一个非常快速的例子,我建议你学习文档和一些教程,这些教程可以让你更多地了解Grails为你提供的所有概念和工具。
将用户写入两个数据库时会出现一些问题。 Grails不提供将多个数据库连接到您的应用程序的能力。有一个名为Datasources的插件允许您在应用程序中定义多个数据源,但缺点是您必须定义哪些域类连接到哪个数据源。因此,您不能拥有主数据库和辅助数据库的用户域类,您必须创建两个域类,每个数据源一个。
答案 1 :(得分:1)
我只会回答基本问题:)
是的,你可以在UserController.groovy中完成。说,你有这样的形式:
<g:form action="someAction" method="post">
<input type="text" name="name" ... />
...
</g:form>
在控制器中,您可以执行此类操作(有多种可能的方法):
def someAction = {
def nameVar = params.name // get the text this way
// process nameVar here
}
至于数据库访问...取决于你想要如何接近它。 Grails建议您执行以下操作:
User theUser = //get the user
theUser.name = //the value
theUser.save(flush:true)
但是,我一次又一次遇到Hibernate的一些问题所以我并不总是使用这种方法。相反,我做了类似Java的编程:
...
theUser.executeUpdate("UPDATE <table_name> ...")
theUser.save(flush: true)
...
然后只需从数据库中选择
...
User.executeQuery("SELECT ...")
...
希望这会有所帮助;)
答案 2 :(得分:0)
对于Q#1,您应该修改控制器中的保存功能。在那里,您可以检查特定用户名的参数,或者根据需要修改新创建的用户对象。
对于Q#2,我建议您查看Datasources plugin
答案 3 :(得分:0)
Q1:这对于GORM Hibernate事件来说确实是一项工作,因为它涉及到您域的业务逻辑约束。
beforeInsert(){
this.name = "William"
}
Q2:使用multiple data sources已集成在Grails 2.0中。不需要插件。