Grails addTo для цикла - PullRequest
       2

Grails addTo для цикла

2 голосов
/ 14 августа 2010

Я делаю сайт для чтения историй. Моя цель - сохранить содержание истории на нескольких страницах, чтобы получить список, а затем легко разбить его на страницы; Я сделал следующее:

В домене я создал два домена, Story:

class Story {

    String title

    List pages

    static hasMany=[users:User,pages:Page]
    static belongsTo = [User]

    static mapping={
        users lazy:false
        pages lazy:false

    }
}

А Page:

class Page {
    String Content
    Story story
    static belongsTo = Story
    static constraints = {
        content(blank:false,size:3..300000)
    }

}

Контроллер save Действие:

def save = {
    def storyInstance = new Story(params)
    def pages = new Page(params)
    String content = pages.content
    String[] contentArr = content.split("\r\n")

    int i=0

    StringBuilder page = new StringBuilder()
    for(StringBuilder line:contentArr){
        i++
        page.append(line+"\r\n")

        if(i%10==0){

               pages.content = page
               storyInstance.addToPages(pages)
               page =new StringBuilder()
        }
    }

    if (storyInstance.save(flush:true)) {
        flash.message = "${message(code: 'default.created.message', args: [message(code: 'story.label', default: 'Story'), storyInstance.id])}"
        redirect(action: "viewstory", id: storyInstance.id)
    }else {
        render(view: "create", model: [storyInstance: storyInstance])
    }
}

(я знаю, это выглядит грязно, но это прототип)

Проблема в том, что я жду, пока storyInstance.addToPages(pages) добавит к набору страниц экземпляр страниц каждый раз, когда выполняется условие. Но что на самом деле происходит, это дает мне последний экземпляр только с последним page_idx. Я думал, что это сохранит страницы по одной, чтобы я мог получить список страниц для каждой истории.

Почему это происходит, и есть ли более простой способ сделать это, чем я?

Любая помощь приветствуется.

1 Ответ

3 голосов
/ 14 августа 2010

Вы работаете только с одной страницей ... Правильное решение:

     def save = {
        def storyInstance = new Story(params)
        def i = 0

        StringBuilder page = new StringBuilder()
        for(StringBuilder line in params?.content?.split("\r\n")){
            i++
            page.append(line+"\r\n")

            if(i%10 == 0){
                   storyInstance.addToPages(new Page(content: page.toString()))
                   page = new StringBuilder()
            }
        }

    if (storyInstance.save(flush:true)) {
        flash.message = "${message(code: 'default.created.message', args: [message(code: 'story.label', default: 'Story'), storyInstance.id])}"
        redirect(action: "viewstory", id: storyInstance.id)
    }else {
        render(view: "create", model: [storyInstance: storyInstance])
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...