grails populating g:从查询中选择

时间:2013-03-20 09:05:12

标签: list grails select

尝试成为grails convert我已经开始将现有的应用程序转换为Grails和Groovy。它工作得很好,但我仍然坚持选择标签的转换。

我有一个域类:

package todo

  class Person {

    String ssn
    String firstname
    String familyname
    String role
    String emailname
    String emailserver
    ...

当创建一个新的“待办事项”任务时,可以从系统中那些开发人员那里分配所有者,我可以使用它(从PHP直接翻译):

<select id="owner" name="owner">
  <option>Noboby ...</option>
  <g:each in="${Person.list()}">
    <g:if test="${it?.role=='developer'}">
      <option value="${it?.id}">${it?.firstname} ${it?.familyname}</option>
    </g:if>
  </g:each>
</select>

但每次尝试使其更加“Grails-ish”都失败了。如何将其塑造成Grails v2.2.1代码?我花了几个小时阅读,尝试,失败。

3 个答案:

答案 0 :(得分:2)

如果您想要使其更具Grails风格,您应该在controllers \ services内执行所有逻辑,而不是在视图中。

假设您在createTodo文件夹和person中有一个视图PersonController,请修改您的createTodo操作:

class PersonController {
    def createTodo() {
        def developers = Person.findAllWhere(role: 'developer')
        [developers: developers, ... /* your other values */]  
    }
}

因此,您不需要在视图中处理数据库操作。

下一步是使用g:select tag,如下所示:

<g:select name="owner" from="${developers}" optionValue="${{'${it.firstName} ${it.familyName}'}}" noSelection="['null':'Nobody ...']" optionKey="id" value="${personInstance?.id}" />

答案 1 :(得分:1)

试试这段代码:

<g:select optionKey="id" from="${Person.findAllByRole('developer')}" optionValue="${{it.fullName}}" value="${yourDomainInstance?.person?.id}" noSelection="['null':'Nobody']"></g:select>

在你的班上:

class Person {
....
String getFullName(){
   it?.firstname+' '+ it?.familyname
}

static transients = ['fullName']
....
}

有关详细信息,请参阅g:select tag

答案 2 :(得分:0)

最后,我根据@“Mr。Cat”解决方案,按照我的意愿让它工作(几乎)。但是,一个小细节,'它'在类中不存在,因此getFullName方法必须变为:

String getFullName(){
   this?.firstname+' '+ this?.familyname
}

起来工作,谢谢你的帮助。