2017-05-27 77 views
0

我对grails完全陌生。我有两个领域类,其中有一个与答案有一对多关系的问题。在grails中正确显示hasMany关系

class Question { 

    String question 

    static hasMany = [answers: Answer] 

    static constraints = { 
     question blank: false 
     answers minSize: 1 
    } 
} 

class Answer { 

    String answer 

    static belongsTo = [question: Question] 

    static constraints = { 
     answer blank: false 
    } 
} 

控制器

@Transactional(readOnly = true) 
 
class QuestionController { 
 

 
    static scaffold = Question 
 

 
    static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 
 

 
    def index() { 
 
    List <Question> questionList = Question.list()[questionList: questionList] 
 
    } 
 

 
    def show() { 
 
    [question: Question.get(params.id).question, 
 
     answers: Question.get(params.id).answers 
 
    ] 
 
    } 
 

 
    def create() { 
 
    respond new Question(params) 
 
    } 
 

 
    @Transactional 
 
    def save(Question question) { 
 
    if (question == null) { 
 
     transactionStatus.setRollbackOnly() 
 
     notFound() 
 
     return 
 
    } 
 

 
    if (question.hasErrors()) { 
 
     transactionStatus.setRollbackOnly() 
 
     respond question.errors, view: 'create' 
 
     return 
 
    } 
 

 
    question.save flush: true 
 

 
    request.withFormat { 
 
     form multipartForm { 
 
     flash.message = message(code: 'default.created.message', args: [message(code: 'question.label', 
 
      default: 'Question'), question.id]) 
 
     redirect question 
 
     } 
 
     '*' { 
 
     respond question, [status: CREATED] 
 
     } 
 
    } 
 
    } 
 

 
    def edit(Question question) { 
 
    respond question 
 
    } 
 

 
    @Transactional 
 
    def update(Question question) { 
 
    if (question == null) { 
 
     transactionStatus.setRollbackOnly() 
 
     notFound() 
 
     return 
 
    } 
 

 
    if (question.hasErrors()) { 
 
     transactionStatus.setRollbackOnly() 
 
     respond question.errors, view: 'edit' 
 
     return 
 
    } 
 

 
    question.save flush: true 
 

 
    request.withFormat { 
 
     form multipartForm { 
 
     flash.message = message(code: 'default.updated.message', args: [message(code: 'question.label', 
 
      default: 'Question'), question.id]) 
 
     redirect question 
 
     } 
 
     '*' { 
 
     respond question, [status: OK] 
 
     } 
 
    } 
 
    } 
 

 
    @Transactional 
 
    def delete(Question question) { 
 

 
    if (question == null) { 
 
     transactionStatus.setRollbackOnly() 
 
     notFound() 
 
     return 
 
    } 
 

 
    question.delete flush: true 
 

 
    request.withFormat { 
 
     form multipartForm { 
 
     flash.message = message(code: 'default.deleted.message', args: [message(code: 'question.label', 
 
      default: 'Question'), question.id]) 
 
     redirect action: "index", method: "GET" 
 
     } 
 
     '*' { 
 
     render status: NO_CONTENT 
 
     } 
 
    } 
 
    } 
 

 
    protected void notFound() { 
 
    request.withFormat { 
 
     form multipartForm { 
 
     flash.message = message(code: 'default.not.found.message', args: [message(code: 'question.label', 
 
      default: 'Question'), params.id]) 
 
     redirect action: "index", method: "GET" 
 
     } 
 
     '*' { 
 
     render status: NOT_FOUND 
 
     } 
 
    } 
 
    } 
 
}

现在,如果我想创建一个问题,答案显示为链接到/答案/ create.gsp,下面的图片

/question/create.gspenter image description here

我在找什么,是,答案似乎为文本框的问题/ create.gsp

形式/question/create.gsp的:

<g:form action="save"> 
 
    <fieldset class="form"> 
 
     <f:all bean="question"/> 
 
    </fieldset> 
 
    <fieldset class="buttons"> 
 
     <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" /> 
 
    </fieldset> 
 
</g:form>

我想我的表单必须有另一个解决方案,我不知道。

在此先感谢!

回答

0

与只是为了演示的部件一个简单的例子中,导航到/问题/ myShow

问题/ myShow.gsp:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta name="layout" content="main" /> 
    </head> 
<body> 
<g:form> 
    <div class="fieldcontain required"> 
     <label for="question">Question</label> 
     <g:textField name="question" value="${question.question}"/> 
    </div> 

    <div class="fieldcontain required"> 
     <label for="question">Answers</label> 
     <g:each in="${question.answers}" var="ans" status="i"> 
      <g:textField name="ans${i}" value="${ans.answer}"/> 
     </g:each> 
    </div> 
</g:form> 
</body> 
</html> 

问题控制器:

def myShow() { 
    [question: Question.first()] 
} 

自举。 groovy

def q1 = new Question(question: 'what is 9 + 10?').save(failOnError: true) 
new Answer(answer: '19', question: q1).save(failOnError: true) 
+0

如果我是n avigating to/question/myShow我收到一个错误:'无法获得属性'问题'空对象',也属性'答案'。我想念什么? – dtsch

+0

我猜你在数据库中没有任何问题?我们上面使用的'first'方法通过ID http://docs.grails.org/latest/ref/Domain%20Classes/first.html获取数据库中的第一条记录,我已经修改了答案以显示在BootStrap.groovy中用问题和答案种子数据库 –

+0

是的,你是完全正确的。谢谢! – dtsch