Grails – 简单有很多问题 – 在create.gsp中使用CheckBox而不是HTML Select

前端之家收集整理的这篇文章主要介绍了Grails – 简单有很多问题 – 在create.gsp中使用CheckBox而不是HTML Select前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题是:我想创建一个grails域实例,定义它拥有的另一个域的’Many’实例.我在 Google Code Project中有实际的来源,但下面应该说明问题.
  1. class Person {
  2. String name
  3. static hasMany[skills:Skill]
  4.  
  5. static constraints = {
  6. id (visible:false)
  7. skills (nullable:false,blank:false)
  8. }
  9. }
  10.  
  11. class Skill {
  12. String name
  13. String description
  14.  
  15. static constraints = {
  16. id (visible:false)
  17. name (nullable:false,blank:false)
  18. description (nullable:false,blank:false)
  19. }
  20. }

如果您为两个控制器使用此模型和def脚手架,那么您最终会得到一个不起作用的表单;

我自己试图让这个工作计算出技能为复选框,看起来像这样;

但是当我拯救志愿者时,技能无效!

这是我的save方法代码;

  1. def save = {
  2. log.info "Saving: " + params.toString()
  3. def skills = params.skills
  4. log.info "Skills: " + skills
  5. def volunteerInstance = new Volunteer(params)
  6. log.info volunteerInstance
  7. if (volunteerInstance.save(flush: true)) {
  8. flash.message = "${message(code: 'default.created.message',args: [message(code: 'volunteer.label',default: 'Volunteer'),volunteerInstance.id])}"
  9. redirect(action: "show",id: volunteerInstance.id)
  10. log.info volunteerInstance
  11. }
  12. else {
  13. render(view: "create",model: [volunteerInstance: volunteerInstance])
  14. }
  15. }

这是我的日志输出(我有自定义toString()方法);

  1. 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"]
  2.  
  3. 2010-05-10 21:06:41,495 [http-8080-3] INFO bumbumtrain.VolunteerController - Skills: [1,2]
  4.  
  5. 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页面;

  1. <tr class="prop">
  2. <td valign="top" class="name">
  3. <label for="skills"><g:message code="volunteer.skills.label" default="Skills" /></label>
  4. </td>
  5. <td valign="top" class="value ${hasErrors(bean: volunteerInstance,field: 'skills','errors')}">
  6. <g:select name="skills" from="${uk.co.bumbumtrain.Skill.list()}" multiple="yes" optionKey="id" size="5" value="${volunteerInstance?.skills}" />
  7. </td>
  8. </tr>

但我需要它来处理像这样的复选框;

  1. <tr class="prop">
  2. <td valign="top" class="name">
  3. <label for="skills"><g:message code="volunteer.skills.label" default="Skills" /></label>
  4. </td>
  5. <td valign="top" class="value ${hasErrors(bean: volunteerInstance,'errors')}">
  6. <g:each in="${skillInstanceList}" status="i" var="skillInstance">
  7. <label for="${skillInstance?.name}"><g:message code="${skillInstance?.name}.label" default="${skillInstance?.name}" /></label>
  8. <g:checkBox name="skills" value="${skillInstance?.id.toString()}"/>
  9. </g:each>
  10. </td>
  11. </tr>

日志输出完全相同!使用两种形式的格式,可以使用“技能”变量中正确引用的技能创建志愿者实例.保存时,后者失败并显示空引用异常,如此问题顶部所示.

希望这是有道理的,提前谢谢!

GAV

解决方法

替换你的create.gsp< g:复选框...>代码
  1. <g:checkBox name="skill_${skillInstance.id}"/>

然后在你的控制器的保存动作中,替换def志愿者实例=新的志愿者(params):

  1. def volunteerInstance = new Volunteer(name: params.name)
  2. params.each {
  3. if (it.key.startsWith("skill_"))
  4. volunteerInstance.skills << Skill.get((it.key - "skill_") as Integer)
  5. }

应该管用. (代码未经测试)

猜你在找的HTML相关文章