Grails - 如何微调事件/行动?

时间:2011-07-20 07:30:10

标签: grails

我对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文件夹/文件以修改此操作行为?

4 个答案:

答案 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中。不需要插件。