Переменная Переменная в Groovy - PullRequest
0 голосов
/ 27 октября 2009

Я в проекте, использующем Grails,

Я использую плагин 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 голосов
/ 28 октября 2009

Вам не нужен знак $ перед beanName, он должен находиться в области видимости.

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

Кроме того, я думаю, что beanFields уже предоставляет сообщения об ошибках через переменную ошибок.

Таким образом, вы можете проверить, не являются ли ошибки нулевыми, вместо вызова hasErrors.

0 голосов
/ 28 октября 2009

После изучения проблемы .. Я обнаружил, что beanName да передается в шаблон, и мне не нужно использовать $ перед beanName ...

Но, тем не менее, когда я использую hasErrors (beans: beanName, поле: '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>

Хотя это не сработало, это зависит от метода validate для классов домена так что написание

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])
            }

Потому что && завершается неудачно с первым результатом 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{            ...              }

Каждый бин проверяется, и все ошибки полей отображаются правильно.

0 голосов
/ 27 октября 2009

Не прямой ответ на ваш вопрос, но вы видели плагин bean-fields?

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

Я думаю, что он делает то, что вы пытаетесь сделать, и даже больше

...