Grails addTo in for loop
I'm doing a website for reading stories. My goal is to do save the content of the story into several pages to get a list and then paginate it easily; I did the following:
In the domain I created two domains, Story
:
class Story {
String title
List pages
static hasMany=[users:User,pages:Page]
static belongsTo = [User]
static mapping={
users lazy:false
pages lazy:false
}
}
And Page
:
class Page {
String Content
Story story
static belongsTo = Story
static constraints = {
content(blank:false,size:3..300000)
}
}
The controller save
action is:
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])
}
}
(I know it looks messy but it's a prototype)
The problem is that I'm waiting for storyInstance.addToPages(pages)
to add to the set of pages an instance of the pages every time the condition is true. But what actually happens that it gives me the last instance only with the last page_idx
. I thought it would save the pages one by one so I could get a list of pages to every story.
Why does this happen and is there a simpler way to do i开发者_C百科t than what i did?
Any help is appreciated.
You are working with only one page... Correct solution:
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])
}
}
精彩评论