如何将多个枚举字段添加到 Grails 4 中的创建和编辑表单?

How to add a multiple enum field to the create and edit forms in Grails 4?

在我的域模型中,一些 类 将枚举集合作为字段。我以两种不同的方式将其建模为嵌入式集合:

class A {
  String name
  Set<Enumeration> enumerations

  static embedded = ['enumerations']
}

enum Enumeration {
  ENUM_VALUE_1,
  ENUM_VALUE_2,
  ENUM_VALUE_3
}

也作为 hasMany 集合:

class A {
  String name

  static hasMany = [enumerations:Enumeration]
}

enum Enumeration {
  ENUM_VALUE_1,
  ENUM_VALUE_2,
  ENUM_VALUE_3
}

在这两种情况下,我都可以通过以下方式将枚举值添加到 BootStrap.groovy 中的集合:

A.withTransaction { status ->
  def a1 = new A( name:"a1" )
  a1.addToEnumerations( Enumeration.ENUM_VALUE_1 )
  a1.addToEnumerations( Enumeration.ENUM_VALUE_2 )
}

使用脚手架,我可以在indexshow页面看到枚举集合的内容,但是在编辑创建页面,只显示标签,不显示小部件。

这是显示小部件的最简单方法,例如多个 select,对于 Grails 4 中的此类字段(我使用的是 Grails 4.0.3)?

提前致谢。

Which is the simplest way to show a widget, e.g. a multiple select, for this kind of fields in Grails 4 (I am using Grails 4.0.3)?

您可以使用 select 标签。

<g:select multiple="true" name="someName" from="${somePackage.SomeEnumClassName}"/>

这是我在@jeff-scott-brown 回答后遵循的过程:

  1. 我为 class A 生成了视图:
generate-views A
  1. 然后在grails-app/views/a/edit.gspgrails-app/views/a/create.gsp我改变了这个元素:
<f:all bean="a"/>

进入这些其他元素:

<f:with bean="a">
    <f:field property="name"/>
    <f:field property="enumerations">
        <g:select 
            multiple="true" 
            name="${property}" 
            from="${Enumeration}"
            value="${a?.enumerations}"
        />
    </f:field>
</f:with>

它适用于 embeddedhasMany 方法。

这不应该是 Grails 中枚举集合的默认脚手架吗?

好吧,如果这是为了验证您的数据库的数据,您可以在您的域上使用 'inList' 约束作为相同的约束,方法是将其提取为 'List' 供您使用:

def class = grailsApplication.getDomainClass(className)
def props = class.getConstrainedProperties()
props.each(){ k,v ->
    if(k=='theColumnName-you-are-trying-to-get'){
        return v.getInList()
    }
}

这是一个更简单的解决方案,无需生成视图,即无需修改 edit.gspcreate.gsp。只需按照@jeff-scott-brown 的建议使用 fields 插件。

假设这是您的域 class:

package mypackage

class MyClass {
  // ...
  // properties
  // ...
  Set<MyEnumeration> enumerations

  // no need to declare it as embedded
  // static embedded = ['enumerations'] 
}

enum MyEnumeration {
  ENUM_VALUE_1,
  ENUM_VALUE_2,
  ENUM_VALUE_3
}

并且您已经为它生成了脚手架控制器,即

package mypackage

class MyClassController {
    static scaffold = MyClass
}

您唯一需要做的就是创建包含以下内容的文件 grails-app/views/_fields/myClass/enumerations/_widget.gsp

<g:select 
    multiple="true" 
    name="${property}" 
    from="${mypackage.MyEnumeration}"
    value="${myClass?.enumerations}"
/>

如果您将枚举集合声明为 hasMany 关联,它也有效,即

package mypackage

class MyClass {
  // ...
  // properties
  // ...

  static hasMany = [enumerations:MyEnumeration]
}

enum MyEnumeration {
  ENUM_VALUE_1,
  ENUM_VALUE_2,
  ENUM_VALUE_3
}