执行脚本GenerateController时出错:没有这样的属性:f for class:SimpleTemplateScript1

时间:2012-09-05 16:21:31

标签: variables grails groovy

好吧,我想在这里节省一些时间,猜猜这不是最聪明的方式。所以在这里,我得到了我正在做的事情。因为我刚出生在grails世界,请放慢速度。让我知道我的方法是好的,或者是否有更聪明的方法。

我有两张桌子abc和def。我想根据一些规则将数据从abc移动到def。对于我的项目,我期待将来有几个这样的情况(映射表klm与xyz,pqr与jkl等等),因此需要进行泛化)。

Abc和Def类如下所示

class Abc {

String firstAbc
String secondAbc

static constraints = {
    firstAbc(nullable:true)
    secondAbc(nullable:true)
}
}

class Def {

String fieldA
String someRandomField

static constraints = {

}
}

我创建了一个名为Mappings的域类(将作为所有未来映射的父级),如下所示

class Mappings {

String inputTable // in this case this will be abc
String inputField // can be firstAbc or secondAbc
String inputValue // some value

String outputTable // def in this case
String outputField // either of fieldA or someRandomField
String outputValue
}

然后我扩展Mappings以创建我的特定实例AbcDefMapping,如下所示

class AbcDefMapping extends Mappings {
}

使用def映射abc的规则存储在AbcDefMapping中。一个这样的规则可能是当abc.firstAbc是“jack”时,在def.fieldA中存储“jacky”。在这种情况下映射的值将是     inputTable = abc     inputField = firstAbc     inputValue =“jack”     outputTable = def     outputField = fieldA     outputValue =“jacky”

我想在Controller.groovy中添加一个名为transform()的方法来完成所需的操作,以便将来我只创建域类,映射类并生成控制器。这就是我的变换方法到目前为止的样子。但我无法继续,直到我解决了手头的问题。如果我解决了这个问题,也许我会进入下一步。你们都知道,过去几天苦苦挣扎

def transform(){
    def csplit = []
    def count = 0
    for (i in ${className}){
        if (i == i.toUpperCase() && count!=0){
            csplit.add(count)

        }
        count++
    }
    def inputs = ${className.substring(0,3)}.list() // here instead of manually inserting 3, I need to insert csplit[0].length
    def inputTable = ${className}.substring(0,1).toLowerCase() + ${className}.substring(1,3) //replace 3 with csplit[0].length
    def mappings = ${className}.executeQuery(" from ${className} acm  where acm.inputTable = '" + inputTable + "'  order by acm.inputField, acm.inputValue, acm.outputField, acm.outputValue")
    println mappings


}

1 个答案:

答案 0 :(得分:0)

Controller.groovy模板实际上是一个巨大的字符串。这意味着评估${}中的任何内容并将其替换为字符串。

很难猜出你真正想要做什么。你现在有什么:

def f = 5
def inputs = ${className.substring(0,f)}.list()

将尝试生成与之匹配的代码,但没有变量f,只有一个读取def f = 5的字符串,它将在生成的控制器中结束。当您实际使用值5时,可以正确评估GString中的表达式。