关于实现添加相关图书功能的一些问题
1.参考Grails实现复杂的数据录入,实现了为图书添加相关图书的功能,但是在随后的测试中
发现了一些问题,现将这些问题列举出来,
(1)当进入新建页面的时候,什么数据也不填,点击保存按钮,如果你在domain类中添加了约
束条件,如果按照正常的情况是应该在页面上显示报错信息。但是此时页面没有报错,但是数
据也没录入,该怎样解决这个问题了。
例如当保存不成功时我们返回到添加页面,如果你的代码类似这样的话
render(view:"create")或者redirect(action:"create")这时就会出现上面的问题。
解决办法,我们在controller中判断保存是否成功的逻辑中假如如下代码:
将代码修改成为
render(view: "newedit",?model: [bookInstance: book])
注意红字部分,保存代码,运行程序,重复上边的步骤。这时会在页面上显示报错信息。
(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)如果我们浏览某本书的详细页面,相关图书那里会有一些问题,出现的数据会有中括号包起
来,如下图所示:
解决方法如下:我们可以写一个循环把它的值取出然后显示出来,正好grails给我们提供了
<g:each>标签,示例如下:
<g:each in="${bookInstance?.relativeBooks}" var="relativeBooks">
<li>${relativeBooks.cName}</li>
</g:each>
ok,保存代码,运行程序,效果如下,当然你可以给给它的显示样式做下改变,这就涉及到
CSS了,这里就不做讨论了。
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再次测试程序,这次程序没有问题了。