最近因为一位极光推送朋友,我开始了大概三四天的Rails学习之路,最终达到的水平是可以比较轻松地做出大部分功能,然后自我感觉可以自如地按照Rails的设计思想去思考。由于编程的日益流行,我结识了越来越多非计算机系的学生出于爱好开始写代码,但是其中的大部分人也许在用着一些错误的学习方式来学习编程,为了避免大家再继续走弯路,在这篇文章中,我会介绍下一个初学者要如何学习Rails。

  1. 为何而学,目标是什么?

  今天和朋友在走路时,谈到要如何学习Rails,我问的第一个问题是,你为什么要学习Rails,你学习编程的目标是什么?为何而学,最终希望达成的结果是任何学习前也许都需要明确的。如果目标是学习“通用性”程序,无论是为了处理数据、还是为了学习语言本身,那么我都建议早点抛弃Ruby,投入到Python的怀抱,虽然任何语言都是图灵完备的,但是每门语言都有着其最合适的应用场景,Ruby几乎完全依赖Rails存在。OK,这里我们暂且假设你学习的目标就是为了可以搭建一个Web网站,好的,我们继续向下说。

  2. 学习基本的HTML知识

  这是大部分初学者学习Rails都忽略的一点,了解基本的HTML知识非常重要。HTML并不需要掌握太深奥的知识,毕竟我们只需要入门。

  如果是精力允许可以花上1到2天左右时间快速通读这本书: 《Head First HTML与CSS》我那位极光推送的朋友就是这么干的。

  读的时候不需要对细节过于在意HTML标签和CSS样式属性的细节,只需要大概了解其中的所有标签,做到脑中有印象,记住一些常用的标签,知道CSS如何作用于HTML即可。复习时随便打开一个网页,对着页面指出这些都分别是什么元素,大脑构思下如果自己来写这个网页要如何组合标签。

  3. 学会使用前端调试工具

  Rails隐藏了大部分的HTML标签,而使用自己的模板语言,这固然方便开发,但是对于调试来说无外乎增加了一层难度。所以学习前端调试工具就显得尤为重要,常用的前端调试工具包括Firefox的firebug,以及Chrome的Developer Tools。这里以Chome的Developer Tools为例,无须学习过多的知识,了解常用的操作即可。

  知道如何查看对应标签的HTML源码,然后尝试去修改一些右侧对应的CSS样式。

  了解如何查看网络请求以及常用的状态码含义,例如200, 304, 500等。

  4. 学习常用的数据库操作

  学习Rails之前,我们还是要把基础的东西都学会更合适,最后一步就是数据库的基础知识。在这里,我个人更为推荐MySQL,原因是资料更多,在自己的本机上装一个MySQL,不用学的太深入,按照教程了解数据库的基本概念:库、表、行、列。然后按照教程操作,了解如何创建一个数据库、创建一个表,基本的增删改查即可。也推荐一本入门书吧官网访问极光推送看看:

  也不用全看完,看到第八章就差不多足够了。毕竟Rails有很完善的数据库操作封装,学习MySQL更多还是为了调试。

  5. 学习Rails基本理念

  好了,我估计上面的几步应该花掉了你三天左右的时间,终于可以开始学习Rails了。Rails有着很清晰的学习指南,不需要看书的,看这里就足够了: http://guides.ruby-china.org/getting_started.html 但是这篇更多还是为了有基础的人准备,如果没有任何语言基础,纯粹按照这个教程往下走会发现自己之后毫无扩展性,做其他的项目都很困难。(这也是我发现很多人的问题) 我们不妨同时在教程中穿插一些练习。以下只为思路,具体可以自己把控。

  我们先按照他的操作一步步向下走,安装Rails,使用脚手架创建Blog程序,Hello Rails。OK,进行到第四步后,请大家暂时停下来。这里我们打印出了Hello Rails,可是请大家先做一个练习:这里希望能用之前的HTML/CSS知识做一个相对复杂的Welcome页面,然后增加导航栏,并且可以根据导航跳转到一个About页面。 请大家在这里思考两个问题:

  1. Rails的路由是如何工作的

  2. Rails的页面模板是如何工作的。

  然后我们继续跟着教程去做,完成第5步,然后这里我们再次做一个练习:

  A. 将数据库从SQLite改成MySQL,并且将数据存储MySQL中。

  B. 每执行一步增删改查的操作都请在MySQL中查看变化

  C. 为文章增加一个字段,例如作者。然后学着去做对应修改,运行迁移后请查看migrate中的SQL发生了什么变化。

  D. 在浏览器查看由Rails生成的表单被解析成了怎样的HTML,查看每次发送一个提交、修改请求时,发生了那些网络请求。

  E. 在自己手写的代码中加入put 打印操作,打印不同的变量,学会基本的调试技巧(例如故意出错,然后打印结果)。例如在下图语句中间增加 puts article_params

  F. 关上教程,独立操作新增一个“增加用户”,“注销用户”,“修改用户”等类似的功能。复习之前的操作。

  G. 思考一些问题,Rails到底是如何工作,Rails的一些操作分别做了什么,route, controller, view, model到底如何配合工作,generate, rake等一些我们使用过的命令分别做了什么事情,并且验证确认。希望这里大家可以在纸上画出一张图,画出rails的每个组件的作用、意义,每个命令都影响了哪些部分。

  继续完成剩余部分,第六部分的作用是完成两个模型的关联。与上述的做法类似:

  A. 我们每做一步操作要思考这一步到底做了什么?对数据库做了哪些操作?

  B. 如果要将文章和作者相关联,那么整个程序要如何修改。

  C. 我们分别看下对应的数据库都发生了什么变化?我们不从Rails的角度去思考,单纯从数据库的角度去思考,那么这些表为什么这么设计。

  D. 如果要给文章打Tag,Tag和文章的关系是什么样,程序如何修改,数据库变成了什么样子。

  E. 如果Tag是由用户打上去的呢?那么程序怎么办呢?

  F. 我相信上述操作,会碰到各种各样的问题,善用Google和Stackoverflow,但是解决问题是没有意义的,要思考为什么这样就能解决问题,然后想清楚后给自己出一个类似的问题让自己去解决。另外,善于使用puts打印来调试问题。(虽然很土,但是很好用)

  6. 学习Rails的若干问题

  A. 学习一门语言最重要的是学习这个语言背后的设计理念和世界观。这也是我讨厌Rails的一点,Rails更加强调约定大于配置,期望你的一切都按照他的步骤去工作,所以我们在学习Rails时最大需要做的转变就是尽量不要去写代码,放下心里的那些不安全感,相信他总会帮你做好的。

  B. 面向对象的设计架构。无论是Django还是Rails都是完全秉承面向对象的设计理念。我们在传统搭建一个项目时,都会首先去想设计这个产品功能时数据库要设计成什么样,然后我们的SQL语句要如何去写。 但是Rails抛弃了数据库的实现细节(这绝不是不写SQL那么简单),例如以上述例子而言,我们只需要明确知道一个Blog会有多个Comment,一个作者会有多个Blog,至于底层如何对应实现交给Rails框架就好了。所以我们需要抛弃语言细节,更多从“对象”的角度去思考整个关系。

  C. 不要纠结于Ruby语法本身,对于初学者而言,千万不要纠结于Ruby语法本身,我相信大部分人至少都考过计算机二级学过C语言,因为大部分功能无外乎增删改查而已,加起来的语句也就那么多,所以照着写,然后遇到功能去查,然后记住足以应付大部分问题。至于Ruby语法,等到进阶时再去读把。

  D. 一定要想清楚Rails各个组件的功能,一个浏览器的url请求到最后HTML页面展现在用户面前,都经历了哪些事情,清楚这个逻辑非常重要。

  E. 反复练习。不要贪图看太多的内容,其实上面那个入门指南已经可以解决80%的问题了,请大家就着某个页面功能反复打磨这个页面,比如增加作者,比如删除评论,比如给评论添加评论,比如所有评论的尾部都带有一个笑脸等等。

  F. 多打印,打印看各种各样的变量,故意制造出错,知道这样做会出错并且猜到出错信息是件很值得做的事儿。这样才能更了解整个框架的运行原理。

  7. 写在最后

  我一直不是很赞同Rails Girl , Django Girl这样的活动,至少不赞同他们的教学模式。编程到底是什么?做出来一个网页?其实我赞同每个人都学一学编程,但是是因为编程最重要的是一种解决问题的能力,知道怎么办、为什么这么做远远要比这样做出来重要的多。当我看到很多人照着教程亦步亦趋地完成一个看似很炫的功能,我不得不说,其实没任何意义,我也并不认为这样能培养所谓的兴趣。思考远远比去做有意义的多。

  希望大家编程愉快。

作者:极光推送 飞林沙

开始了大概三四天的Rails学习之路的更多相关文章

  1. [Rails学习之路]初识Ruby(一)

    Ruby是一门动态的.强类型的.纯面向对象的编程语言.它和Python非常相似,但比Python面向对象更加彻底.使用更加灵活.语法更加复杂.也更为有趣. 抛开做事情到底应该有多少种方法这个问题,我相 ...

  2. [Rails学习之路]Rails路由配置

    如果是使用Rails的默认约定,那么几乎是零配置. 但有些时候,我们可能不得不(或者更喜欢)进行一些特殊的配置. 其实Rails在路由功能中也有很丰富的配置选项. routes.rb文件中靠前的规则优 ...

  3. [Rails学习之路]Rails文件结构与路由

    约定优于配置和RESTful是Ruby on Rails十分推崇的哲学.在一个默认的RESTful的Rails项目中,使用资源和HTTP动词来帮助组织项目. 假如有一个使用scaffold创建的Rai ...

  4. [Rails学习之路]初识Ruby(二)

    继续上次Ruby的学习.接下来就到了Ruby的方法. Ruby的方法与Python仍然很像.使用def定义,可以使用undef取消定义. 在Ruby中,经常可以看见方法后面跟有"?" ...

  5. rails学习笔记: rake db 相关命令

    rails学习笔记: rake db 命令行 rake db:*****script/generate model task name:string priority:integer script/g ...

  6. (转)如何学习Java技术?谈Java学习之路

    51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...

  7. 我的nodejs学习之路1

    距离上次写文章类东西已经有4-5年了,猛然写东西有种提笔忘字的感觉. 言归正传,这是一篇记录我自己学习nodejs的文章,在写下这篇文章的时候我也不是什么大牛,也不是很了解nodejs这项技术.之所以 ...

  8. spring源码学习之路---深入AOP(终)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...

  9. 初次踏上GUI编程之路(有点意思,详细介绍了菜鸟的学习之路)

    初次踏上GUI编程之路 —— 我的Qt学习方法及对Qt认识的不断转变 -> 开始接触GUI与开始接触Qt: 话说,我第一次看见“Qt”这一个名词,好像是在CSDN网站的主页上吧,因为CSDN好像 ...

随机推荐

  1. sae中thinkphp使用smarty

    因为最近在学thinkphp跟着做一个小商城. 没有使用thinkphp自带的think引擎,使用的是smarty引擎. 在sea中使用的时候出现了问题.已经是前几天的事了,问题图片没保存下来. 在网 ...

  2. 外显率&显性上位

    外显率(penetrance): 外显率是指条件下,群体中某一基因型(通常在杂合子状态下)个体表现出相应表型的百分率.外显率等于100%时称为完全外显(complete penetranc)低于100 ...

  3. 强行在MFC窗体中渲染Cocos2d-x 3.6

    [前言] 把Cocos2dx渲染到另一个应用程序框架中的方法,在2.x时代有很多大神已经实现了,而3.x的做法网上几乎找不着.这两天抽空强行折腾了一下,不敢独享,贴出来供大家参考. [已知存在的问题] ...

  4. C# INotifyPropertyChanged使用方法

    INotifyPropertyChanged 接口:向客户端发出某一属性值已更改的通知. NotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通 ...

  5. enum 用法

    public enum WeekDay { SUN(, "Sunday", "SUN"), MON(, "Monday", "MO ...

  6. Log4j与common-logging联系与区别

    http://blog.csdn.net/courage89/article/details/29649801

  7. QEMU ELF_LOAER分析[基于MIPS]

    本文用于记录对QEMU对ELF文件加载函数进行分析.根据“函数使用->函数定义->函数实现->函数实现的分析”的顺序进行分析,最终提取出ELF文件加载的代码. 1. load_elf ...

  8. linux命令行模式下对FTP服务器进行文件上传下载

    参考源:点击这里查看   1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码 ...

  9. MongoDB基础之六 索引

    一 . 索引概述和基本操作 1. 索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建索引2. 在mongodb中,索引可以按字段升序/降序来创建,便于排序3. 默认是用btree来组 ...

  10. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...