【问题标题】:Multiple Nested Domains Over Multiple Forms in GrailsGrails 中多个表单上的多个嵌套域
【发布时间】:2013-01-03 01:17:13
【问题描述】:

我是 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.myAlbums = artist.albums

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

我希望这个问题有一定的意义,我感谢任何反馈......包括替代方法。

【问题讨论】:

    标签: grails groovy nested-forms


    【解决方案1】:

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

    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]
         ...
    }
    

    【讨论】:

    • 金照-谢谢你的解释。 save() 函数是否必须在相册控制器中?此逻辑是否可以存储在单独的控制器中(不是绑定到域的控制器)?我有一个名为 registerartist 的控制器,我希望使用它,但我注意到当我将参数作为上面的模型传递时(参数:[albums:artist.albums])似乎没有任何通过。再次感谢您抽出时间来帮助我...非常感谢!
    • save() 是 Grails 附带的一种方法。您可能需要先通过Grails tutorials 学习基础知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多