0

尝试成为 grails 转换者我已经开始将现有应用程序转换为 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 代码?我花了几个小时阅读,尝试,失败。

4

3 回答 3

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 标签,如下所示:

<g:select name="owner" from="${developers}" optionValue="${{'${it.firstName} ${it.familyName}'}}" noSelection="['null':'Nobody ...']" optionKey="id" value="${personInstance?.id}" />
于 2013-03-20T09:58:09.920 回答
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 标签了解更多详情

于 2013-03-20T09:54:50.800 回答
0

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

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

启动并工作,感谢您的所有帮助。

于 2013-03-22T15:45:41.487 回答