Vấn đề của tôi là: Tôi muốn tạo một thể hiện miền grails, xác định trường hợp 'Nhiều' của một tên miền khác mà nó có. Tôi có nguồn thực tế trong một số Google Code Project nhưng sau đây sẽ minh họa sự cố.Grails - Simple hasMany Problem - Sử dụng CheckBox thay vì HTML Chọn trong create.gsp
class Person {
String name
static hasMany[skills:Skill]
static constraints = {
id (visible:false)
skills (nullable:false, blank:false)
}
}
class Skill {
String name
String description
static constraints = {
id (visible:false)
name (nullable:false, blank:false)
description (nullable:false, blank:false)
}
}
Nếu bạn sử dụng mô hình này và def scaffold
cho hai Bộ điều khiển thì bạn kết thúc bằng một biểu mẫu như thế không hoạt động;
nỗ lực riêng của tôi để có được điều này để làm việc liệt kê các kỹ năng như hộp kiểm và trông như thế này;
Nhưng khi tôi lưu các tình nguyện viên những kỹ năng là null!
Đây là mã dành cho phương pháp lưu của tôi;
def save = {
log.info "Saving: " + params.toString()
def skills = params.skills
log.info "Skills: " + skills
def volunteerInstance = new Volunteer(params)
log.info volunteerInstance
if (volunteerInstance.save(flush: true)) {
flash.message = "${message(code: 'default.created.message', args: [message(code: 'volunteer.label', default: 'Volunteer'), volunteerInstance.id])}"
redirect(action: "show", id: volunteerInstance.id)
log.info volunteerInstance
}
else {
render(view: "create", model: [volunteerInstance: volunteerInstance])
}
}
Đây là đầu ra nhật ký của tôi (Tôi có phương thức toString() tùy chỉnh);
2010-05-10 21:06:41,494 [http-8080-3] INFO bumbumtrain.VolunteerController - Saving: ["skills":["1", "2"], "name":"Ian", "_skills":["", ""], "create":"Create", "action":"save", "controller":"volunteer"]
2010-05-10 21:06:41,495 [http-8080-3] INFO bumbumtrain.VolunteerController - Skills: [1, 2]
2010-05-10 21:06:41,508 [http-8080-3] INFO bumbumtrain.VolunteerController - Volunteer[ id: null | Name: Ian | Skills [Skill[ id: 1 | Name: Carpenter ] , Skill[ id: 2 | Name: Sound Engineer ] ]]
Lưu ý rằng trong dòng đăng nhập cuối cùng, kỹ năng đã được chọn và là một phần của đối tượng. Khi tình nguyện viên được lưu, 'Kỹ năng' bị bỏ qua và không được cam kết với cơ sở dữ liệu mặc dù phiên bản bộ nhớ được tạo rõ ràng không có các mục. Không thể vượt qua các kỹ năng tại thời điểm xây dựng? Phải có một cách vòng này? Tôi cần một hình thức duy nhất để cho phép một người đăng ký nhưng tôi muốn chuẩn hóa dữ liệu để tôi có thể thêm nhiều kỹ năng hơn sau này.
Nếu bạn nghĩ rằng điều này nên 'chỉ hoạt động' thì một liên kết đến một ví dụ làm việc sẽ là tuyệt vời.
Nếu tôi sử dụng HTML Chọn thì nó hoạt động tốt! Chẳng hạn như những điều sau đây để tạo trang Tạo;
<tr class="prop">
<td valign="top" class="name">
<label for="skills"><g:message code="volunteer.skills.label" default="Skills" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: volunteerInstance, field: 'skills', 'errors')}">
<g:select name="skills" from="${uk.co.bumbumtrain.Skill.list()}" multiple="yes" optionKey="id" size="5" value="${volunteerInstance?.skills}" />
</td>
</tr>
Nhưng tôi cần nó để làm việc với các hộp kiểm như thế này;
<tr class="prop">
<td valign="top" class="name">
<label for="skills"><g:message code="volunteer.skills.label" default="Skills" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: volunteerInstance, field: 'skills', 'errors')}">
<g:each in="${skillInstanceList}" status="i" var="skillInstance">
<label for="${skillInstance?.name}"><g:message code="${skillInstance?.name}.label" default="${skillInstance?.name}" /></label>
<g:checkBox name="skills" value="${skillInstance?.id.toString()}"/>
</g:each>
</td>
</tr>
Kết quả nhật ký chính xác giống nhau! Với cả hai kiểu dáng của thể hiện Tình nguyện được tạo ra với các kỹ năng được tham chiếu chính xác trong biến 'Kỹ năng'. Khi lưu, sau này thất bại với một ngoại lệ tham chiếu null như được hiển thị ở đầu câu hỏi này.
Hy vọng điều này có ý nghĩa, cảm ơn trước!
Gav
Lifesaver! Đây là một nhức đầu như vậy – gav
Bạn hoan nghênh :-) – fabien7474
Tối ưu hóa nhỏ- it.key.startsWith tốt hơn it.key.contains – mmigdol