保华的Rails学习笔记

如何快速排除bug(一)

正式做全栈营线上助教一个星期了,还是挺有成就感的,帮助同学们取得进步的同时,也倒逼自己成长了许多,其实做助教如果想做好,每天要花的时间还挺多的,除了值班的时间段内替同学们解决问题,功夫往往还要下在别处,为了提高排查问题的速度,最近研究了一些linux命令,还是挺好用的,下边分享一下grep的简单、实用的用法

grep是搜索文本内容的强大工具,它把匹配出来的行展示出来,其中-i参数表示在匹配时,忽略大小写,-E参数后边可以用正则表达式,可以匹配多个内容,例如可以匹配包含has_many与belongs_to的行并显示到终端,善用grep命令行工具,可以大大提高排除bug的效率

heroku logs | grep -i error


当我们在上传heroku出错时,为了排查问题,会去看heroku logs信息,而heroku logs的信息,还是挺庞杂的,一行一行的找报错信息,还是挺费眼睛的,夸张一点,有点像大海捞针
直接执行heroku logs的结果如下图:


其实报错信息一般都会有error字眼,而heroku logs | grep -i error的作用,就是只显示包含有error的行,其他信息都不显示,这样大大减少了浏览器的log信息量,可以快速定位出错信息
用heroku logs | grep -i error的结果如下图:

git grep -i bootstrap

这个命令的作用是把这个专案中,文件中包含有bootstrap字眼的行展示出来,供我们集中查看,不用一个文件一个文件的排查问题了,大大提高了效率


我们直接可以在终端查看app/assets/javascripts/application.js、app/assets/stylesheets/application.scss和Gemfile中包含bootstrap的行了,更快的定位bug问题所在

git grep -i -E 'has_many|belongs_to'

这个命令的作用是把专案中的文件包含有has_many或者belongs_to的行列出来,展现到终端,它的执行结果如下:


当发生关联关系错误时,用这句命令可以快速定位问题所在,不需要一个一个文件打开,如上例中,相当于我们直接查看group.rb、post.rb、user.rb和group_relationship.rb这4个文件中起关联作用的行,效率提高了不少吧

grep的主要作用就是文本搜索,大家可以展开想象,扩展它的应用场景

使用一些简单的linux命令工具辅助查找问题,可以大大提高效率,这些命令的作用很强大,它有很多选项,不过不建议过度深究,能达到我们想要的效果,够用就行

sqlite3可视化数据库工具

在rails的开发环境中,数据库里边的内容,我们基本是通过rails console来查看的,很不直观,而且当有复杂的关系时,例如多对多关系(需要通过第三个model实现)也不容易理清相互之间的关系
下边介绍一个可视化的sqlite工具,帮助我们更直观的查看数据库里边的数据
下载地址:http://sqlitebrowser.org/


MAC需要下载这个文件,下载后,安装
打开

点击打开数据库

选择你专案里边的数据库文件
数据库文件路径为:db/development.sqlite3
打开后

我们可以看数据表的结构、以及每个table的内容等,很方便

我们对数据表的操作,例如增加、删除,以及更新数据,在这表里都有更新,这样看数据,更方便吧

随机赋值的用法

在网站开发过程中,有时候需要给一个栏位随机赋值,例如rails101中,当给group增加一个栏位user_id时,数据库中之前group的user_id就为nil,这时候就会报错,类似

这时候,我们可以在rails console中,为group的user_id随机赋值(这样更像真实场景的数据)

与刘慧玲同学讨论后,得到的方法如下:


用rand产生随机数,rand(1..2)表示产生1到2之间包含1和2的随机数,rand(6)随机产生0到5的随机数

用sample方法,[1,2].sample表示产生1或者2的随机数,它从一个数组中随机抽取一个值

group删除后my posts出错的解决方法

在rails101,教材的写法中,如果删除group,那么它下边的post还是存在的,这时候,如果点击下拉框中的my posts,就会报错:


这是因为虽然删除了group,但是它下边的posts还存在,当显示这些post的时候,因为它没有所属的group,所以才会出错

解决办法:
1、直接用Post.all.delete_all这种方法最简单,但是它把其他文章都删除了,显然在production环境中,这样做是不符合逻辑的

2、找出这些文章,删除它们


步骤,先要知道,删除的group的group_id,然后定位到它下边的文章,最后删除就可以了

3、先找出删除的group_id,然后把它下边的文章的group_id批量赋值给其他group

4、与3相近,再建立一个group,然后把这些group的id,赋值给删除的group_id
例如删除了id为18的group,那么新建立一个group后,把这个group的id赋值为18

后3种方法,可以使这些文章都保留下来,而且my posts正常显示

为了彻底解决这个问题,用了上边4个方法后,还需要修改group.rb文件,把
has_many :posts这一句修改为 has_many :posts, dependent: :destroy
当样,当删除group后,它下边的所属的文章,也一并都删除

关于多对多关系表-加入群组

加入群组:其实就是在group_relationship里边增加一条记录
退出群组:其实就是在group_relationship里边删除一条记录

前端优化的一些问题

1.为什么要将 CSS 放在最顶层,将 JavaScript 放在最底层?
网页在打开的时候,是先下载HTML代码的,如果CSS放在最前边,即放在head里边的话,可以先下载下来,我们知道,CSS是控制网页的样式的,当CSS下载完以后,页面的样式可以呈现出来了,如果CSS放在中间或者后页,那么网页打开的时候,可能先是一片乱乱的,然后下载到CSS代码的时间才正常,这显然是不合理的

而JS一般都比较肥大,如果我们将JS代码放在head里边的话,会很耽误下载速度的,JS一般来说是实现某些功能的特效之类,甚至有的时候,还要用户点击什么的,所以把它放在后边,等网页通过CSS完美呈现出样式时,再加载JS,对用户来说,基本没什么影响的

2.如何尽可能减少HTTP Requests?
浏览器每次向服务器发出请求,都是需要打招呼时间的,所以如果我们把JS合并到一个文件中,把CSS合并到一个文件中,那么可以减少请求次数,这样就可以提高网页的加载速度,这部分功能rails已帮我们实现,它是通过rake assets:precompile来实现的,我们可以打开网站(heroku上边的,它是经过rake assets:precompile处理过的),查看源代码,可以看出来,确实处理了


我们可以看到,JS处理到一个文件了,CSS也放到了一个文件,当我们点击开这些文件时,发现里边的代码是经过压缩了

也就是空白行都消失了。这样可以减少页面的体积,可以提高网站的响应速度

3.CDN是什么?请用自己的话解释
CDN就是根据用户所在的地区,从而选择为用户服务的服务器,例如广东用户,就选择广东这边的服务器来给用户提供服务,这样可以大大提升用户打开网站的速度,例如网站有许多图片,这些图片,在每个地区都存一份,广东服务器存一份,北京服务器存一份,当广东用户打开网站的时候,是广东服务器提供的下载服务,同理,北京的用户打开网站时,就是北京的服务器给这位用户提供下载服务,如果北京服务器没存,那北京服务器就会请求主服务器给它一份,以后北京的用户再访问时,就由北京的服务器来提供服务

4.如何提升自己的网站加载速度?
主要有前端优化与后端优化
前端优化我们可以做的有,把CSS放在head标签里边,把js尽量放在页面的后边
把CSS合并成一个文件,把JS合并成一个文件,这两步rails通过rake assets:precompile
已经帮我们做了
可以启用CDN服务
网站的用户在哪里比较多,主服务器,就放在那个地区

我在全栈营购物网站大赛中所取得的进步

从去年12月6号到今天,我在全栈营学编程已经3个月了,这3个月,挺忙挺累的3个月,不过感觉特别有成就感,不但学到了编程技巧,以后可以直接用的上,而且领略了元学习法的精秒之处,不管以后学什么新技能,都可以运用这套方法。

第一个月基本就是在做前三课的内容,其实仔细算起来,这部分的学习还不到1个月,前三课的内容,确实挺精华的,特别是rails101,特别的实用,它是ruby on rails中运用频率最高的一些功能及方法,也就是老师所说的高频小套路,只要把前三课吃透,其实可以写出很多东西了,它是精华内容,101我也做了10遍,不过最近有时间,我打算还是再做三四遍,通过后边内容的学习,对前边的知识也有了更深的认识,所以现在再做101,我想不但可以复习,而且可以把后边学到的串联起来,做到融会贯通

前三课学完以后,就是招聘课程,它是一个小迁移,前边的如果掌握牢固,招聘课程并不难,感觉也就是多了图片上传以及其它功能,学完招聘课程,我们进行了招聘课程大赛,我做了一个重生人才网,其实之前从来没有从头到尾建立好一个网站,看着自己的作品一点一点的做出来,还是挺开心的,而且确实是可以用的,用人单位以及应聘者,都可以上去发布工作以及投递简历的,通过招聘课程大赛,感觉自己还是有很多潜能的,人有时候真的要逼自己一把,不然连自己都不知道自己究竟能做到哪种程度。

最难的课程,就要属购物课程了,老师说它比前边课程难了三四倍,也确实感觉难了许多,不过我们都硬着头皮坚持下来了,而且还参加了购物JDstore网站大赛,这次比赛是组队参加,我和北京的yanni同组,非常感觉她的付出,在这里向她表示感谢!我们两个刚开始没有选择好项目,就选择了比较大众化的产品化妆品项目,一个北京,一个广州,我们选项目,计划、沟通,都是网上进行的,开始讨论是用的谷歌环聊,挺强大的工具,可以共享桌面,可以视频,在谷歌环聊,确定好第一版面大概要做的.

第一版面做出来的时候,基本的功能都有了,例如搜索、分类等,就是一个基本的化妆品网站,我们采用大图的形式,显的比较醒目,做搜索的时候,用了ransack,做招聘网站的时候,我的搜索并没有用ransack,做分类,我们用的是添加controller的形式,就像rails101里边的我的文章页面一样的实现原理,其实很多功能,我们一定要做一做的,很多东西做了才知道,而且其实也并不难,论坛里边,以及去谷歌,基本都能找到条案,做网站,功能不一定非的要酷炫,但是基本的东西要有,而且不一定要做的很复杂,在这次协作过程中,我们也学会了使用github来管理两个人的代码,github还是挺强大的代码管理工具,可以merge,可以pull,push等,也学会了解决代码冲突,这些都是非常宝贵的经验。说说我们这次做的不好的地方吧

首先,我们上线不早,看着别人的作品很漂亮的时候,直接打击了自己的自信心,以至到最后的时候,产生了焦虑的心理,以至于中间好多天,我根本就没去做魔改,直接去做购物课程了,首先在花在魔改上的时间,比别人就少了许多天,中间有几天,不想写代码,即使有时间,也不想动手去写代码,其实大家做的大概功能都差不多,只是我实在是太欠缺前端知识以及设计能力了,做出来的版面,太普通了,以后这块要补,要学习一些UI方面的知识。

我沟通能力也不强,一直觉得自己的沟通、协调能力都不佳,很多东西会自己做,缺乏与别人的沟通,现在都是讲究资源整合的时代了,这方面的能力一定要加强。

产品根本没有去推广,我们两个都没去推广自己的作品,看着同学们都在论坛发贴子推广自己的作品,其实这样做还挺有效的,例如郑智与俊鸿同学,一直都在论坛分享,尤其他们写的前端系列,直接帮助了很多人,我也从中收益良多,至所以自己没去推广,根本就是觉得自己作品没有做好。以后做项目,质量一定要跟的上,然后营销是一定要去做的,好东西就要去推广,让更多人受益

大赛结束了,不过我想真正的精彩还在后边,相信大家通过大赛,都重新对自己进行评估,相信在未来,大家都会做出自己精彩的作品,直接让市场去检验。

我的专属优惠码:f6a1-5090-df58

rake db:rollback的一些用法

1、rake db:rollback 向前回溯一步migrate,执行这个命令时,在终端看执行结果,可以看出有执行drop_table

2、rake db:rollback STEP=n 恢复上n次的migrate,例如rake db:rollback STEP=3,恢复最近的三次migrate

3、rake db:migrate VERSION=20080906120000 - Run all necessary migrations (up or down) to get to the given version

git log的一些常用命令

1、git log 查看commit历史

2、git show <commit-hash-id>查看某次commit的修改内容

3、git log -p file,查看某个文件的修改历史,例如
git log -p app/controller/groups_controller.rb


按上下箭头,可以翻页,下边显示end,就表示结尾

4、git log -p -2查看最近2次的更新内容

git log -p app/views/groups/index.html.erb显示这个文件的修改历史,有具体内容
git log app/views/groups/index.html.erb显示这个文件的个性历史,仅显示commit信息,并不显示具体修改的内容

5、git log -p -1 app/views/groups/new.html.erb 执行的结果是显示这个文件最近一次的修改记录

6、git log -p -1 app/views/common/_n* 可以用通配符