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

从这个图片中可以看出,可以通过修改app/views/say/hello.html.erb文件,来修改显示内容。下面我们来修改这个文件,让它说”Hello, Rails”。修改后的代码如下:
<h1>Hello, Rails</h1> <p>Find me in app/views/say/hello.html.erb</p>
这时,刷新页面,看看是否如我们预期的那样输出的。如果你会抱怨,怎么没有动态内容?那么,我们现在来动态显示当前时间。代码如下:
<h1>Hello, Rails</h1> <p>It is now<%=Time.now %></p>
再次刷新页面,看看是否输出了当前时间。
为了能让你感受到Controller和View(这里就是hello.html.erb文件)之间的联系,我们现在再次修改代码。将app/controllers/say_controller.rb的代码修改成如下:
class SayController < ApplicationController
def hello
@time = Time.now
end
def goodbye
end
end
将app/views/say/hello.html.erb的代码修改成如下:
<h1>Hello, Rails</h1> <p>It is now<%= @time %></p> <% # 注意这里的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内置了方法,只需要如下方式修改就行了:
<h1>Hello, Rails</h1> <p>It is now<%= @time %></p> <p> Time to say <%=link_to "Goodbye", say_goodbye_path %>! </p>
使用link_to方法生成链接,第一个参数是链接要显示的文字,第二个是生成的路径。路径也有一定的规则:”Controller名称”_”Action名称”_path。
这里只给出一个例子,另外一个例子大家可以练习一下。
常用命令
上面的例子中就用了一些命令。在以后的章节中,还会接触到不少命令。这里给大家介绍一些比较常见的命令。如下:
# 新建一个rails工程 rails new <Project_Name> 开启服务 rails server [-p <Port_Number>] # 操作数据库 sudo rails dbconsole # 如果是ubuntu,需要sudo,要不然权限有问题 # 通过rails的scaffold脚手架生成一个简易Web CRUD程序,包括一组Model、Views和Controller rails generate scaffold person name:string bio:text birthday:date # 创建一个model rails generate model <Model_Name> # 删除这个创建的model rails destroy model <Model_Name> # 创建一个controller rails generate controller <Controller_Name> [Action_Name]? # 注意:创建一个Controller时,会把相关的View也创建处理。 # Action可以有多个,中间使用空格分隔 # 创建数据库(指定环境需要加上: RAILS_EVN=product) rake db:create # 根据config/database.yml中的配置创建各环境下的空数据库 # 根据app的migration 文件生成对应的表 rake db:migrate # 执行载入种子资料(开发用的测试数据库的数据),种子文件存储在db/seed.rb rake db:seed # 预处理app/assets目录下的Javascript、CSS以及图片 # 最新版的Rails的样式使用SCSS来定义,必须预处理一下页面才能正常显示。 rake assets:precompile # 生成Rails API文档 rake doc:rails # /doc/api目录下就有了一份完整的Rails API文档 # 进入控制台 rails c # 或者 rails console # 安装plugin rails plugin install <Plugin_URL> #对应的plugin会被安装到Vendor目录下 # 为了加快新建一个WEB应用程序,而不访问网络,可以采用以下步骤,快速建立 # 前提是曾经用访问网络的方法,新建过一个 rails new <Project_Name> --skip-bundle cd <Project_Name> bundle install --local
参考资料
原文链接:https://wordpress.diguage.com/archives/105.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
