开发者社区> 问答> 正文

极光推送一个朋友,三四天的Rails学习之路? 报错

极光推送一个朋友,三四天的Rails学习之路? 400 报错

  最近因为一位极光推送朋友,我开始了大概三四天的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这样的活动,至少不赞同他们的教学模式。编程到底是什么?做出来一个网页?其实我赞同每个人都学一学编程,但是是因为编程最重要的是一种解决问题的能力,知道怎么办、为什么这么做远远要比这样做出来重要的多。当我看到很多人照着教程亦步亦趋地完成一个看似很炫的功能,我不得不说,其实没任何意义,我也并不认为这样能培养所谓的兴趣。思考远远比去做有意义的多。

  希望大家编程愉快。

展开
收起
优选2 2020-06-04 21:19:39 1224 1
2 条回答
写回答
取消 提交回答
  • 第12周 上机报告 1之练习3 回文日 2011-12-09 790阅读 贺利坚

     题目:很诱人的一个题目:2011年11月02日是一个回文日:2011 1102,我们刚刚度过!请列出近80年和近60年还有多少个回文日(假如我们能活到百岁,你和我的……)。注意:一年只有12个月。 2012年11月30日新发的程序: #include <iostream> using namespace std; int main( ) { int year,month,day 题目:很诱人的一个题目:2011年11月02日是一个回文日:2011 1102,我们刚刚度过!请列出近80年和近60年还有多少个回文日(假如我们能活到百岁,你和我的……)。注意:一年只有12个月。

    2012年11月30日新发的程序:

    #include  using namespace std; int main( ) { int year,month,day,y,anothery; bool is_cycle; int count=0; for(year = 2012; year < 2092; year++) { month=year%100; //month取到的是年的后两位 month = (month%10)*10 + month/10; //将后两位倒过来,确定月份 day=year/100;   //day取到的是年的前两位 day=(day%10)*10+day/10; //将前两位倒过来,确定日期 is_cycle =false; switch(month) //12个月份,各自对应合法的日期范围 { case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(day<=31) is_cycle =true; break; case 4: case 6: case 9: case 11: if(day<=30) is_cycle=true; break; case 2: if((year%4==0&&year%100!=0)||year%400==0) //闰年 { if(day<=一

    2023-03-02 20:14:54
    赞同 展开评论 打赏
  • 赞######如果想从服务器端推送消息到客户端的话,个人觉得 GoEasy 推送还不错,它有 Restful API 支持多语言,而且针对 java 他们还特别做了 SDK, 使用很简单方便。同时它也支持客户端推送。由于它支持 websocket polling 两种连接方式所以兼顾大多数主流浏览器,低版本的 IE 浏览器也是支持的,很适合需要快速建立实时 web 通信的项目。 https://goeasy.io 相关博客: http://www.cnblogs.com/jishaochengduo/articles/5552645.html

    2020-06-05 11:53:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
蚂蚁金服高级开发工程师萧恺:IDEA 插件开发入门教程 立即下载
从《阿里巴巴Java开发手册》编写推广谈技术成长 立即下载
《阿里巴巴Java开发手册(详尽版)1.4.0》 立即下载