Grails中多个表单上的多个嵌套域

时间:2013-01-03 01:17:14

标签: grails groovy nested-forms

我是grails的新手并且正在尝试构建一个具有一对多关系的小应用程序而且我被卡住了。

因此有三个域类Artist,Album和Song。意图是双重嵌套的1-> m关系:

艺术家可以有很多专辑,而专辑可以有很多歌。

class Artist {

    List albums = new ArrayList()

    static hasMany = [albums: Album]

    String artistName

    static mapping = {
        albums cascade:"all-delete-orphan"
    }
}

    class Album {

    String albumName
    String albumDescr

    static belongsTo = [artist: Artist]

    List songs = new ArrayList()
    static hasMany = [songs: Song]

    boolean deleted
    static transients = [ 'deleted' ]


     static mapping = {

         songs cascade:"all-delete-orphan"
    }
}

    class Song{

    Album album
    static belongsTo = [album: Album]
    String songName
    Integer trackNumber

    boolean deleted
    static transients = [ 'deleted' ]
}

我想使用一系列表单来处理数据输入。在第一个视图中,将使用任何关联的相册创建艺术家。这种观点类似于 此处描述的观点:http://omarello.com/2010/08/grails-one-to-many-dynamic-forms/

在提交表单时,艺术家和相关相册将被保存(如下所示)

 def artist = new Artist(params)
 artistGroup.save()

以下是我需要帮助的部分......

下一个视图将显示使用上一个视图创建的相册,并提示用户为每个视图添加乐曲信息。提交此表格后 歌曲将被保存。

我以为我会在flash范围内传递已保存的相册

 flash.myAlbums = artist.albums

所以它们可以显示在第二个视图中。然而,显示专辑的名称只是故事的一部分,因为我们将需要Album.id以保存每个 歌曲(并正确关联其专辑)。如何将此ID有效地传递到第二个视图中,以便在提交第二个表单时可以正确地保存每个歌曲?我已经看到了这个post并且它确实有关系,但它没有尝试将数据保存到多个视图中。

我希望这个问题有道理,我感谢任何反馈......包括替代方法。

1 个答案:

答案 0 :(得分:0)

在相册控制器的save()方法中,使用params渲染第二个视图,如:

Class AlbumController {
    ......
    def save() {
        def artist = new Artist(params)
        artist.save()                       //the original artistGroup.save() won't work
        params.albumsSelected.each{album->           //for instance, you can pass all the album_id related to the artist in this parameter
            def albumInstance = Album.get(album)
            artist.addToAlbums(albumInstance)
        }
        render(view:'showAlbum', params:[albums:artist.albums])
    }

    def addSong() {
        def albumSelected = Album.get(params.album)
        def songToAdd = Song.findBySongName(params.songName)
        albumSelected.addToSongs(songToAdd)
        ......
    }

<强> showAlbum.gsp:

...
<g:form name="addSong" action="addSong">
    <g:select name="album"
          from="${albums}"
          optionKey="id"
          optionValue="albumName" />
    <g:textField name="songName"/>
    <g:submitButton name="add" value="Add To Album" />
</g:form>
...

您还需要删除域类中的重复属性定义:

 class Song{
 //    Album album    is not needed when there is a 'belongsTo' definition
     static belongsTo = [album: Album]
     ...
}