Groovy中的变量变量

时间:2009-10-27 10:55:05

标签: grails groovy grails-plugin

我正在使用Grails的项目,

我用bean beanFields插件我将bean更改为:inputTemplate到以下

   <bean:inputTemplate>
    <div class="prop ${hasErrors(bean:$beanName,field:'$fieldId','errors')}">${label}
      <span  class="value">${field}
      </span>
    </div>
  </bean:inputTemplate>

尽可能地,我正在尝试使用$ beanName作为BeanName ..这是因为beanFields将beanName和fieldId以及一些其他属性传递给inputTemplate标记。

但是,问题是我不能那样做。而且我真的很懒,也不想花费所有时间复制和粘贴相同的字段div并保留一个巨大的文件...

所以,如果在这种情况下有任何帮助,我会非常感激。

我想在$ {}代码块中引用一个变量,就像在PHP中有$$变量一样,它使用$变量的值作为要评估的变量的名称。

希望我很清楚......并感谢你的帮助。

3 个答案:

答案 0 :(得分:0)

不能直接回答你的问题,但是你看过bean-fields插件了吗?

http://grails.org/plugin/bean-fields

我认为它会做你想要做的事情,而且还有更多

答案 1 :(得分:0)

你不应该在beanName前面使用$,它应该在范围内。

<div class="prop ${hasErrors(bean:beanName,field:'username','errors')}" >

另外,我认为beanFields已经通过errors变量提供了错误消息。

因此,您可以测试是否错误不是null而不是调用hasErrors。

答案 2 :(得分:0)

调查问题后..我发现yeah beanName被传递给模板,我不需要在beanName前面使用$ ...

但是,当我使用hasErrors(beans:beanName,field:'username','errors')时,它仍无效。

但是,我可以这样做

<bean:inputTemplate>
    <div class="prop">${label}
      <span  class="value">${field}
      </span>
      <g:if test="${errors}"><div class="errors"> ${errors} </div></g:if>
    </div>
  </bean:inputTemplate>

即使它不起作用,它依赖于域类的验证方法 所以写这个

if ( ! (userSecurity.validate() && userProfile.validate() && address.validate() && photo.validate() ) ){
                    flash.message = ' Error registering user '
                    render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
            }else{
                    UserSecurity.withTransaction { status ->
                            userProfile.photos*.save()
                            address?.save()
                            userProfile?.save()
                            userSecurity.password = userSecurity.password.encodeAsPassword()
                            userSecurity.confirmPassword = userSecurity.confirmPassword.encodeAsPassword()
                            userSecurity?.save()
                    }
                    flash.message = 'No Errors Registering User'
                    render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
            }

因为,&amp;&amp;第一个False结果失败,其他验证方法没有执行。

将它们改为此

if ( ! (userSecurity.validate() & userProfile.validate() & address.validate() & photo.validate() ) ){
                    flash.message = ' Error registering user '
                    render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
            }else{            ...              }

每个bean都经过验证,所有字段错误都能正确呈现。