Как изменить то, что Grails помещает в раскрывающийся список в f: all

У меня очень простой проект, в котором у пользователей есть учетные записи, а у учетных записей есть транзакции.

Я сгенерировал представления, контроллеры и сервисы с помощью Grails generate-all Transaction.

Объект домена транзакции выглядит следующим образом:

class Transaction {
    Account account
    BigDecimal debit = 0
    BigDecimal credit = 0
    static constraints = {
    }
}

В контроллере есть только это:

def create() {
    respond new Transaction(params)
}

т.е. отправляет только новую транзакцию (не список счетов).

Однако в пользовательском интерфейсе создания есть раскрывающийся список всех учетных записей в системе (не только для этого пользователя):

введите здесь описание изображения

Вопрос в том, есть ли способ «исправить», чтобы отображались только учетные записи пользователей? Если нет, я всегда могу вручную написать представление создания с жестко запрограммированным полем. Просто интересно, есть ли классный способ Grails сделать это.

См. https://github.com/nutmix/grails-dropdow-air.


person John Little    schedule 08.03.2019    source источник


Ответы (1)


Это сложный вопрос, не так ли? После некоторого изучения решения этого вопроса я обнаружил, что мы можем выполнить эту задачу, выполнив описанные ниже действия.

В create представлении transaction немного настройте способ отображения данных:

<g:form resource="${this.transaction}" method="POST">
    <fieldset class="form">
         <f:field bean="transaction" property="account" wrapper="transaction/account"/>
         <f:all bean="transaction" except="account"/>
    </fieldset>
...
            </g:form>

где wrapper - это каталоги (т.е. путь), куда мы помещаем _wrapper.gsp. Подробнее о Загрузка шаблонов в обычном примере чтобы знать, как и где вы определяете индивидуальную оболочку, шаблон и виджет. Чтобы решить вашу проблему, _wrapper.gsp имеет следующие коды:

<%@ page import="dropdown.Account" %>
<%
    def values = dropdown.Account.all.collect {it.currencyIso}.unique(true)
    //println values
%>
<div class="fieldcontain required">
    <label for="account">Account <span class="required-indicator">*</span></label>
    <g:select name="account" from="${values}"
              value="${transaction?.account}"/>
</div>

Местонахождение _wrapper.gsp – grails-app/views/_fields/transaction/account/_wrapper.gsp.

Результат выглядит следующим образом. введите здесь описание изображения

P/S: у меня возникла эта идея, когда я наткнулся на ответ о f:table.

person Tung    schedule 26.07.2019