GORM - 将child添加到父级,save保存为groovy.lang.MissingMethodException

时间:2012-07-29 16:58:11

标签: grails groovy gorm grails-2.0

这是我的域名模型,调查有很多问题,每个问题都有很多回复:

class Survey {

    String name
    String customerName
    static hasMany = [questions: SurveyQuestion]

    static constraints = {
    }
}

class SurveyQuestion {

    String question

    static hasMany = [responses : SurveyQuestionResponse]
    static belongsTo = [survey: Survey]

    static constraints = {
    }
}

class SurveyQuestionResponse {

    String description
    static belongsTo = [question: SurveyQuestion]

    static constraints = {
    }
}

在我的控制器中,我有一个方法,它接收调查的ID,查找它,然后从另一个请求参数构建一个问题,尝试将问题添加到调查并保存:

def addQuestion =
    {
        def question = new SurveyQuestion(question:params.question)
        def theSurvey = Survey.get(params.id)

        theSurvey.addToQuestions(question) //fails on this line
        theSurvey.save(flush:true)

        redirect(action: showSurvey, params:[id:theSurvey.id])
    }

然而,它失败并返回:

  

没有方法签名:roosearch.Survey.addToQuestions()是   适用于参数类型:(roosearch.SurveyQuestion)值:   [roosearch.SurveyQuestion:null]可能的解决方案:   addToQuestions(java.lang.Object),getQuestions()

我不太明白我在这里做错了什么,我已经尝试了各种替代方法来创建问题,甚至用文字字符串手动实例化一个,但它总是给出相同的错误。

有人可以告诉我吗?

由于

3 个答案:

答案 0 :(得分:1)

问题是你没有"问题"保存,所以它还没有在数据库中。尝试先保存"问题"然后将其添加到调查中。 像这样:

def addQuestion =
    {
        def question = new SurveyQuestion(question:params.question).save()
        def theSurvey = Survey.get(params.id)

        theSurvey.addToQuestions(question)
        theSurvey.save(flush:true)

        redirect(action: showSurvey, params:[id:theSurvey.id])
    }

答案 1 :(得分:0)

(我没有足够的评论意见,所以我会“回答”)。

首先,它确实看起来“OK”。

我已经学会了以面值的方式显示错误消息。出于某种原因,它认为“问题”是空的。我猜你可以插入一些日志记录,看看它不是。

此时,我会先尝试保存问题,看看它是否正确保存并获得分配和ID,然后调用addToQuestions。

答案 2 :(得分:0)

如果使用输入参数实际创建了SurveyQuestion,你可以尝试断言吗? 例如

assert question 

后面

def question = new SurveyQuestion(question:params.question)

并按照#alcoholiday的建议尝试一些日志记录。 还是一个简单的

println params

可以快速浏览一下