大佬教程收集整理的这篇文章主要介绍了Grails – 简单有很多问题 – 在create.gsp中使用CheckBox而不是HTML Select,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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) } }
如果您为两个控制器使用此模型和def脚手架,那么您最终会得到一个不起作用的表单;
但是当我拯救志愿者时,技能无效!
这是我的save方法的代码;
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]) } }
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 ] ]]
请注意,在最终日志行中,已选择了正确的技能,并且这些技能是对象实例的一部分.当志愿者被保存时,“技能”被忽略并且没有被提交到数据库,尽管内存版本明确地创建了项目.是不是可以在施工时通过技能?这一定有办法吗?我需要一个表单来允许一个人注册,但我想规范化数据,以便我以后可以添加更多技能.
如果您认为这应该“正常工作”,那么指向实际示例的链接将非常棒.
如果我使用HTML SELEct那么它工作正常!如下面的Make页面;
<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>
但我需要它来处理像这样的复选框;
<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,'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>
日志输出完全相同!使用两种形式的格式,可以使用“技能”变量中正确引用的技能创建志愿者实例.保存时,后者失败并显示空引用异常,如此问题顶部所示.
希望这是有道理的,提前谢谢!
GAV
<g:checkBox name="skill_${skillInstance.iD}"/>
然后在你的控制器的保存动作中,替换def志愿者实例=新的志愿者(params):
def volunteerInstance = new Volunteer(name: params.Name) params.each { if (it.key.startsWith("skill_")) volunteerInstance.skills << Skill.get((it.key - "skill_") as Integer) }
应该管用. (代码未经测试)
以上是大佬教程为你收集整理的Grails – 简单有很多问题 – 在create.gsp中使用CheckBox而不是HTML Select全部内容,希望文章能够帮你解决Grails – 简单有很多问题 – 在create.gsp中使用CheckBox而不是HTML Select所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。