0
私はGrailsにとって全く新しいです。回答に1対多の関係を持つ質問を持つ2つのドメインクラスがあります。は、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.gspの質問/ 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>
私の気づいていない私のフォームには別の解決策が必要だと思います。
ありがとうございます!
私がn/question/myShowに移動すると、「プロパティを取得できません」という質問が 'nullオブジェクトに対して'返されます。私は何かが恋しいですか? – dtsch
あなたのDBに質問がないと思いますか?上記で使用している「最初の」メソッドは、ID http://docs.grails.org/latest/ref/Domain%20Classes/first.htmlでDBから最初のレコードを取得します。 BootStrap.groovyの質問と回答をDBにシードする –
はい、あなたはまったく正しいです。ありがとう! – dtsch