Включить булевы параметры с g: include передаются как строки во включенное представление - PullRequest
0 голосов
/ 08 января 2019

Я не знаю, является ли следующее изменение проблемой или предназначением.

<g:include view="line.gsp" params="['label':'test', 'progress':false]"/>

Тогда выражение в line.gsp всегда оценивается как true, потому что типом параметра progress является String, а не Boolean.

  class is: ${params.progress.getClass()}
  <g:if test="${params.progress}">
   this should not be displayed
 </g:if>

Обратите внимание, что то же самое применимо для других типов, а не только для логических. Я использую Grails 3.3.8 Этого не произошло в Граалсе 2.5.2.

Я ничего не нашел об этом в Интернете, поэтому я спрашиваю здесь. Спасибо.

Edit:

Как предположил Даниэль, я пробовал также с граалями 3.3.2. Я только что создал приложение с помощью grails create-app и изменил существующий index.gsp, включив в него line.gsp, как показано в приведенном выше коде.

Вот скриншот: enter image description here

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Вы можете проверить это следующим образом

<g:if test="${params.progress && params.progress == 'false'}">
   this should not be displayed
 </g:if>
0 голосов
/ 16 января 2019

Я понимаю, что вы уже нашли обходной путь к этому, но меня беспокоило, что ваш код не работал так же, как мой, поэтому я решил немного продолжить расследование на случай, если кто-нибудь еще столкнется с этой проблемой.

Как уже упоминали другие люди, params.anything обычно возвращает строковое значение. Это связано с тем, что параметры обычно кодируются как параметры URI (например,? Progress = false), а не автоматически помещаются в другие типы. (Это вполне разумно; у Grails не было бы хорошего способа узнать, каким типом они должны быть.) Однако возможно (и иногда разумно) визуализировать ваш вид или шаблон из контроллера, такого как render view: whatever, model: [your: model, params: params], где вы специально включаете параметры в модели. (Возможно, у вас есть много параметров, которые вам не нужно индивидуально воссоздавать в модели.) В этом случае карта параметров будет существовать как параметры URI (? Progress = false) и запись модели в области страницы (params: [ progress: Boolean.FALSE]). Область страницы имеет приоритет над параметрами URI, поэтому ваши типы будут сохранены.

В моем тестировании я добавил ваш код на существующую страницу, где я уже передавал параметры в модель, поэтому тип был сохранен и для вновь добавленного параметра. (Обратите внимание, что как только параметры попадают в область видимости страницы, они также доступны для включенных шаблонов или представлений.) Следовательно, я видел тип логического прогресса, тогда как в базовом примере это был бы тип String.

TL / DR: либо предполагайте, что параметры являются строками, либо явно включайте параметры в вашу модель области страницы при рендеринге.

0 голосов
/ 11 января 2019

Да, это правда. Когда вы звоните params.something, вы фактически получаете доступ к GrailsParameterMap, который является картой. Таким образом, ваше условие фактически оценивается как Map-> get (), которое будет Object-> toString (), и, конечно, оно истинно, потому что оно не равно нулю и не пусто. Поэтому решение будет следующим:

<g:if test="${params.getBoolean("progress")}">
   this should not be displayed
</g:if>
...