补充说明:前面我们修改和增加都使用了goods_id,没有像表单页面中需要的那些字段一样设置成attr_accessible,是因为我们数据库中该商品号字段设计为自增所以不需要在表单中添加该字段的输入框。而添加商品或修改商品都涉及到我们去修改数据库中的数据,而商品号我们在add页面没有去修改,是数据库自增的,在edit页面也没有修改商品号商品号仍然是原来的。至于我们根据goods_id来找到修改的链接页面这个我们只是读取,没有写,所以不设置attr_accessible,默认为protected的权限就够了,不能写入或修改,读取还是可以的。
?
?
?
数据的show、add已经做好了,现在来做数据的修改部分。
(1)我们点击修改的链接,会跳转到修改页面,不过修改页面的数据是假的数据,无论点击哪个商品的修改链接结果都是那个假数据页面,结果如下:
(2)上面的返回连接我们在一开始就做好了,这些链接什么的不涉及数据库操作我们在前面就做好了。我们要实现点击哪个修改链接都能在修改页面显示对应商品的数据,而不是假数据。
1.为了规范,且rails默认的路由规范,我们把带有视图的修改动作名update改为edit,这样我们就可以定义实际修改发生的动作名为update。
修改路由第19行update成edit如下,因为我们修改的是具体某个商品所以路由参数需要具体商品的goods_id,结果如下:
2.修改视图文件update.html.erb,不要使用refactor的方式,我们把里面的代码复制,然后删除update.html.erb,创建视图文件edit.html.erb,把原来update.html.erb的代码黏贴进去。
3.我们更改把控制器中update动作改为edit动作,并添加代码
10~12行修改为:
4.修改show页面的修改链接
原来的58行每个链接都是update,所以无论哪个商品点击修改链接都是同一个页面,都是一样的假数据
我们应该修改58行,后面添加参数goods_id,这样才能跳转到具体商品的修改页面
58行修改后如下:
5.我们测验一下是否可行,我们先把数据库中goods_id为1的记录goods_id改为111,这样数据库中第一条记录goods_id为2,如下:
然后我们在show页面光标移动到第一个修改链接时,左下角有显示该记录的goods_id /edit,说明结果就和数据库中对应上了。
6.上面的修改说明链接正确了,而且命名也规范了,但是这时候我们还需要用ruby代码去改写edit页面才能显示真实的数据而非假数据。
附注:如下sql语句是查询全部字段,*,如果我们写出具体字段会报错miss其余的字段,这个先不管,反正查询全部字段后你要使用部分字段还是全部字段都可以。
?
把edit页面由假数据的静态页面改成动态页面很有趣,因为你add页面模板跟edit页面模板都是一样的表单,区别在于edit页面的表单是显示数据库中的商品信息,而add页面表单空白需要我们输入,所以根据它们的共同点,我们这样来做:
1、把edit静态页面的代码全部删除
2、把add页面的代码全部复制到edit页面
只需要上面两步,也就是add页面和edit页面代码全部一样
结果就是我们点击某个商品链接,会自动跳转到该商品的edit页面,该页面会自动显示对应的数据库信息如下:
如上显示的页面和add页面一样,不过能使用对应控制器edit动作中在数据库获得到的数据展现在页面上。但是我们把带有添加字眼的文字都改成修改好了,如下第4行和第13行:
改为:
(3)既然两个add页面和edit页面代码一样,为何edit页面却能自动读取数据库中的数据并展现在页面呢?这个区别是因为页面可以使用对应的控制器动作中获取到的数据库数据的区别导致的。如下edit动作获取到数据库中对应:goods_id的商品信息,所以视图中能自动读取并展现,而add动作就没有读取数据库中的数据。
(4)这时候我们还需要添加一个真正的修改动作update,而且也要适当地去修改动态页面代码
1、添加路由第21行,注意http动作需要是post方式
2、控制器添加update动作第29~34行
3、将如下22行代码修改掉提交给哪个动作执行
原来的代码:
修改第22行后的代码:
4、结果如下,我们点击某个商品的修改链接,在后面添加3333华为
点击按钮提交成功转到show页面,并且数据确实修改成功,页面和数据库中的数据都能看到修改后的结果
?
上面修改商品的功能也完成了,接下来完成删除商品的功能,商品删除比上面就简单多了,删除功能不需要两个动作来完成(一个有视图一个没视图,如edit和update两个配合完成),因此不需要视图文件,
(1)添加路由第22行,rails规范中删除动作命名为destroy,而delete只是url命名为其他也行,不过从规范来讲最好还是命名为delete。因为删除的是某个具体商品,所以需要商品号goods_id做参数
(2)添加destroy动作,第36~41行
(3)修改show页面中删除的链接代码第59行
原来的代码:
修改第59行后的代码:
附注:.html.erb视图模板里面的页面链接url写的都是路由,也就是路由文件中get或post后面的东西,而不是写动作,所以是/delete而不是/destroy
(4)查看效果
原来的页面如下:
我们点击序号为6对应记录的删除链接之后,跳回本页面且记录删除成功了,说明删除功能完成:
?
?