尝试成为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代码?我花了几个小时阅读,尝试,失败。
答案 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
}
起来工作,谢谢你的帮助。