`
jiang_grails
  • 浏览: 42743 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于实现添加相关图书功能的一些问题

阅读更多

1.参考Grails实现复杂的数据录入,实现了为图书添加相关图书的功能,但是在随后的测试中

发现了一些问题,现将这些问题列举出来,

(1)当进入新建页面的时候,什么数据也不填,点击保存按钮,如果你在domain类中添加了约

束条件,如果按照正常的情况是应该在页面上显示报错信息。但是此时页面没有报错,但是数

据也没录入,该怎样解决这个问题了。

例如当保存不成功时我们返回到添加页面,如果你的代码类似这样的话

render(view:"create")或者redirect(action:"create")这时就会出现上面的问题。

解决办法,我们在controller中判断保存是否成功的逻辑中假如如下代码:

将代码修改成为

render(view: "newedit", model: [bookInstance: book])

注意红字部分,保存代码,运行程序,重复上边的步骤。这时会在页面上显示报错信息。

image

(2)如果我们进入编辑页面的话,此时你会发现页面没数据。这问题可以这样解决,原代码如

下:

def edit={ 
book=Book.get(params.id) 
}

我们将其修改如下:

def edit = { 
def bookInstance 
if(params.id){//如果有参数,则表明是要进入编辑页面

bookInstance = Book.get(params.id)

}else{//没有参数,则表示新建 
bookInstance = new Book()

bookInstance.properties = params


return [bookInstance: bookInstance]//得返回这个,否则在编辑页面没值 
}

注意红字部分。

ok,保存代码,运行程序,再次进入编辑页面就会出现数据了。

(3)如果我们浏览某本书的详细页面,相关图书那里会有一些问题,出现的数据会有中括号包起

来,如下图所示:

image

解决方法如下:我们可以写一个循环把它的值取出然后显示出来,正好grails给我们提供了

<g:each>标签,示例如下:

<g:each in="${bookInstance?.relativeBooks}" var="relativeBooks">

<li>${relativeBooks.cName}</li>

</g:each>

ok,保存代码,运行程序,效果如下,当然你可以给给它的显示样式做下改变,这就涉及到

CSS了,这里就不做讨论了。

image

ps:这是最近遇见的一个问题,在测试页面时发现,当我编辑一个图书时,我将该图书的相关

图书删除一些后,然后点击保存,然后再查看该图书的详细信息时发现,该图书的相关图书没

有改变,还是原来的那些,如果我在编辑时,删除一些相关图书,然后再添加一些的话,再查

看详细图书时,发现相关图书会出现混乱,一本书可能出现两次,通过在控制台打印信息发

现,该图书的相关图书,Book.relativeBooks,例如你新建的一本书的相关图书有3本,那么

这个Book.relativeBooks的长度为3,这个长度只能增加,不会再减少。仔细检查代码,最终

找到了解决方法。

def edit = { 
def bookInstance 
if(params.id){//如果有参数,则表明是要进入编辑页面

bookInstance = Book.get(params.id)

}else{//没有参数,则表示新建 
bookInstance = new Book()

book.relativeBooks = null//将其相关图书清空

bookInstance.properties = params


return [bookInstance: bookInstance]//得返回这个,否则在编辑页面没值 
}

在原action中加入红色字体的代码,现将相关图书清空,然后再利用properties属性,为

book赋值。

ok再次测试程序,这次程序没有问题了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics