Показать перечисленные значения на странице GSP и затем связать их в базе данных - PullRequest
7 голосов
/ 29 июля 2011

У меня есть сценарий использования, в котором мне нужно сначала показать значение enum на странице GSP сначала в раскрывающемся списке, попросить пользователя выбрать одно из этих значений и, наконец, связать данные с доменом.

Так что мой код в GSP выглядит так: мое перечисление MyEnum

<g:select from="${MyEnum.getAllEnumList()}" optionValue="name" name="duration"/>

мое перечисление

public enum MyEnum {

    MIN15('15 Minutes'),
    MIN30('30 Minutes'),
    HOUR1('1 Hour'),
    HOUR2('2 Hours'),
    HOUR5('5 Hours'),
    HOUR8('8 Hours'),
    HALFDAY('half day'),
    FULLDAY('full day')

    private final String name
    private final String displayName

    public static final List<MyEnum> getAllEnumList() {
        [MIN15,MIN30,HOUR1,HOUR2,HOUR5,HOUR8,HALFDAY,FULLDAY]
    }

    public String toString() {
        return displayName
    }

    MyEnum(String name,String displayName) {
        this.name = name
        this.displayName = displayName;
    }

}

когда я нажимаю на страницу, появляется ошибка вроде:

Error processing GroovyPageView: Error executing tag <g:form>: Error evaluating expression [MyEnum.getAllEnumList()] on line [37]: java.lang.NoClassDefFoundError: Could not initialize class ENUM.MyEnum at D:/myspace/projects/IcepushpluginSampleApp/grails-app/views/util/test.gsp:46

Любые идеи ????

Ответы [ 3 ]

9 голосов
/ 03 августа 2011

Вот как я это делал в прошлом. Таким образом, у вас есть поддержка i18n.

GSP

<g:select name="duration" from="${MyEnum.values()}" valueMessagePrefix="ENUM.MyEnum" />

messages.properties

ENUM.MyEnum.MIN15=15 Minutes
ENUM.MyEnum.MIN30=30 Minutes
ENUM.MyEnum.HOUR1=1 Hour
ENUM.MyEnum.HOUR2=2 Hours
ENUM.MyEnum.HOUR5=5 Hours
ENUM.MyEnum.HOUR8=8 Hours
ENUM.MyEnum.HALFDAY=half day
ENUM.MyEnum.FULLDAY=full day
2 голосов
/ 29 июля 2011

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

MyEnum.groovy

enum MyEnum {
    MIN15('15 Minutes'),
    MIN30('30 Minutes'),
    HOUR1('1 Hour'),
    HOUR2('2 Hours'),
    HOUR5('5 Hours'),
    HOUR8('8 Hours'),
    HALFDAY('half day'),
    FULLDAY('full day')

    final String displayName

    private MyEnum(String displayName) {
        this.displayName = displayName
    }

    String getKey() {
        name()
    }

    String toString() {
        displayName
    }
}

MyEnumTagLib.groovy

// add import if MyEnum is in a different package

class MyEnumTagLib {
    static namespace = 'my'

    def enumSelect = { attrs ->
        attrs.from = MyEnum.values()
        attrs.optionKey = 'key'
        out << g.select(attrs)
    }
}

GSP

<my:enumSelect name="duration"/>
2 голосов
/ 29 июля 2011
<%@ page import="fully.qualified.path.MyEnum" %>

Попробуйте это наверху вашего GSP (с полным указанием пути, конечно, под ваши пакеты).

Изменить (это должно работать (ваш синтаксис enum тоже неверен)):

<%@ page import="ENUM.MyEnum" %>
<html>
<head>
</head>
<body>
<g:select from="${MyEnum.getAllEnumList()}" optionValue="displayName" name="duration"/>
</body>
</html>

А потом пересмотренный класс:

package ENUM

public enum MyEnum {

    MIN15('15 Minutes'),
    MIN30('30 Minutes'),
    HOUR1('1 Hour'),
    HOUR2('2 Hours'),
    HOUR5('5 Hours'),
    HOUR8('8 Hours'),
    HALFDAY('half day'),
    FULLDAY('full day')


    private final String displayName

    public static final List<MyEnum> getAllEnumList() {
        [MIN15,MIN30,HOUR1,HOUR2,HOUR5,HOUR8,HALFDAY,FULLDAY]
    }

    public String toString() {
        return displayName
    }

    MyEnum(String displayName) {

        this.displayName = displayName;
    }
}

Edit2:

Самый простой способ избежать всего этого (и второй ответ здесь, и мое решение) - просто передать список значений gsp из контроллера. Просто добавьте

[duration:MyEnum.values()]

или что-то похожее на возврат вашего контроллера.

...