《Agile Web Development with Rails》抄书笔记系列
“《Agile Web Development with Rails》抄书笔记系列”目录
在上一节中,D瓜哥简单讲解了一下Rails环境的搭建。这一节,D瓜哥将通过一个小小的例子,来给大家演示Rails的牛逼之处!
新建工程
用过Java的人都知道,即使在Eclipse等集成开发工具中,新建一个工程也相当麻烦。各种选择、各种设置,真心很麻烦。那叫一个纠结啊!(不瞒大家,D瓜哥就是Java攻城师一枚。)
您知道Rails中新建一个工程需要多大的工作量吗?如果我告诉你,只需要一条命令,你信吗?我们来试试吧。命令如下(这里假设,我们新建的工程名为demo):
然后,会有一堆输出,这个先暂时不用理。现在,进入demo目录,启动Rails服务器,命令如下:
不出意外,可以从浏览器中访问一下:http://127.0.0.1:3000/,查看一下工程运行情况了。
解决联网问题
大家在新建工程时,在进行到”bundle install”时,可能会报网络连接失败等类似的错误。这是由于国内特殊的网络问题。这是由于Ruby Gems托管到了AWS上,访问时,偶尔会抽风!我们只需要修改一下Ruby Gems的镜像服务器地址,让其访问国内的镜像服务器即可。修改方法也很简单,进入新建工程的目录下,打开Gemfile文件,找到相应的内容(一般是第一行),将其修改成如下内容即可:
再次感谢李华顺!感谢淘宝网!修改完成后,允许如下命令,完成项目新建:
使用本地Gem新建工程
如果已经新建过一个或者多个Rails工程,则工程相关的Gem包都已经安装到本地了。所以,我们再次新建工程的时候,可以使用本地的Gem包,而不用联网下载。这样的指令和上面的稍有一些不同。如下:
1 | rails new <Project_Name> --skip-bundle |
工程目录初识
刚刚新建工程时,Rails输出了一堆文字,新建了一堆文件。下面,D瓜哥Rails工程的各个目录以及个别文件做个简要介绍。工程目录树如下:
03 | |-- app # 存放项目的代码,Model、View、Controller都在此,大部分工作在此进行。 |
07 | | | |-- javascripts # 存放JavaScript代码 |
08 | | | | `-- application.js |
09 | | | `-- stylesheets # 存放CSS文件 |
10 | | | `-- application.css |
11 | | |-- controllers # 存放控制器Controller |
12 | | | `-- application_controller.rb |
13 | | |-- helpers # 存放视图辅助类,一些常用的代码段 |
14 | | | `-- application_helper.rb |
17 | | `-- views # 存放生成HTML的所有模板文件 |
19 | | `-- application.html.erb |
23 | | |-- database.yml # 数据库连接信息 |
30 | | | |-- backtrace_silencers.rb |
33 | | | |-- secret_token.rb |
34 | | | |-- session_store.rb |
35 | | | `-- wrap_parameters.rb |
38 | | `-- routes.rb # URL映射,或者路由 |
40 | |-- db # 存放DB结构(Schema)的信息。 |
42 | |-- doc # 存放文档,RDoc自动生成的文档 |
44 | |-- Gemfile # Gem依赖配置文件 |
45 | |-- Gemfile.lock # 根据Gemfile生成的文件 |
46 | |-- lib # 存放应用程序运行过程中所需要的类,会被自动加载 |
49 | |-- log # 存放程序运行期间产生的日志 |
50 | |-- public # Web能访问的目录,app/assets目录处理后生成的图片、JS和CSS存放于此 |
55 | | |-- index.html # 默认的首页 |
56 | | `-- robots.txt # 真是难以想象,这个文件也建立了! |
59 | |-- script # 一些有用的脚本用来启动和生成代码 |
63 | | |-- functional # 功能测试 |
66 | | | `-- browsing_test.rb |
72 | `-- vendor # 一些程序依赖的外部类库,和lib一样,也是自动加载的 |
78 | 37 directories, 37 files |
这里,大家对各个目录有一个基本认识就行了。以后用到哪些目录,还会再详细介绍的。
Hello, Rails
在编程界,”Hello, World”绝对是大名鼎鼎,可谓无人不知无人不晓啊!D瓜哥也难逃俗套,整个”Hello,Rails”。
由于Rails是MVC的一个实现,而且View和Controller联系很紧密,所以,我们只需要新建一个Controller即可。在Rails,这个工作很简单,只需要一个简单的命令即可,配套的View模块文件也会一同生成。命令以及执行情况如下:
01 | rails generate controller Say hello goodbye |
02 | create app/controllers/say_controller.rb |
03 | route get "say/goodbye" |
07 | create app/views/say/hello.html.erb |
08 | create app/views/say/goodbye.html.erb |
10 | create test /functional/say_controller_test.rb |
12 | create app/helpers/say_helper.rb |
14 | create test /unit/helpers/say_helper_test.rb |
17 | create app/assets/javascripts/say.js.coffee |
19 | create app/assets/stylesheets/say.css.scss |
从输出的这个日志信息也可以看出来,Rails新建了一些文件。我们首先来打开app/controllers/say_controller.rb来查看一下这个Controller的内容:
1 | class SayController < ApplicationController |
里面什么内容也没有,不过从代码中可以看出,集成了ApplicationController类。看来应该有一些Controller的共有方法和功能。但是,hello方法和goodbye方法是空的。他们究竟做了什么呢?我们打开页面看一下,打开http://127.0.0.1:3000/say/hello,如下图所示:

从这个图片中可以看出,可以通过修改app/views/say/hello.html.erb文件,来修改显示内容。下面我们来修改这个文件,让它说”Hello, Rails”。修改后的代码如下:
2 | < p >Find me in app/views/say/hello.html.erb</ p > |
这时,刷新页面,看看是否如我们预期的那样输出的。如果你会抱怨,怎么没有动态内容?那么,我们现在来动态显示当前时间。代码如下:
2 | < p >It is now<%=Time.now %></ p > |
再次刷新页面,看看是否输出了当前时间。
为了能让你感受到Controller和View(这里就是hello.html.erb文件)之间的联系,我们现在再次修改代码。将app/controllers/say_controller.rb的代码修改成如下:
1 | class SayController < ApplicationController |
将app/views/say/hello.html.erb的代码修改成如下:
2 | < p >It is now<%= @time %></ p > |
3 | <% # 注意这里的time和上面的变量名保持一致 %> |
再次刷新浏览器,是不是再次正常显示出时间了?
经过上面的折腾,相信你对这里的关联有一定体会了。下面,我们来了解一下整个处理过程:
- 用户访问http://127.0.0.1:3000/say/hello;
- Rails根据URL去匹配路由规则,然后将URL的最后两段,分成两部分。第一部分say被解析成一个Controller名称的一部分,然后创建一个SayController(在app/controllers/say_controller.rb中定义)对象;
- hello用来标识action。Rails将调用Controller中的同名方法进行处理客户端的请求。这里,将创建一个名称为time的Time对象;
- Rails去查找合适的视图。在app/views目录下,查找和Controller同名(say)的目录,然后在其子目录中,查找和Action同名(hello)的erb文件,这里是hello.html.erb;
- Rails处理ERB文件,执行里面的Ruby代码,替换由Controller设置的变量;
- 将结果返回给浏览器。Rails完成处理过程。
页面互联
根据上一小节的内容,可以看出,目前应用有两个链接:http://127.0.0.1:3000/say/hello和http://127.0.0.1:3000/say/goodbye。但是,这两个方法是孤立的。我们怎样让它们连接到一起呢?
也许,你已经想到,在ERB文件中直接使用<a>标签,添加两个链接就行了。但是,这样不利于维护,如果以后的服务器或者路径变了,要把所有相关的文件都打开重新修改一遍。
其实,Rails内置了方法,只需要如下方式修改就行了:
2 | < p >It is now<%= @time %></ p > |
6 | <%=link_to "Goodbye", say_goodbye_path %>! |
使用link_to方法生成链接,第一个参数是链接要显示的文字,第二个是生成的路径。路径也有一定的规则:”Controller名称”_”Action名称”_path。
这里只给出一个例子,另外一个例子大家可以练习一下。
常用命令
上面的例子中就用了一些命令。在以后的章节中,还会接触到不少命令。这里给大家介绍一些比较常见的命令。如下:
02 | rails new <Project_Name> |
05 | rails server [-p <Port_Number>] |
11 | rails generate scaffold person name:string bio:text birthday: date |
14 | rails generate model <Model_Name> |
17 | rails destroy model <Model_Name> |
20 | rails generate controller <Controller_Name> [Action_Name]? |
47 | rails plugin install <Plugin_URL> |
52 | rails new <Project_Name> --skip-bundle |
参考资料
- Rails创建项目的目录结构
- Rails详细介绍(一)目录结构
- rails3 中的一些命令记录
- Rails3学习笔记与参考1–基本命令参考