34
2
gem install
命令安装:
$
gem install rails
为了确认一切都正确安装好,执行下述命令:
$
rails --version
Rails
提供了一系列脚本,叫做生成器,目的是让开发更简单、更迅速。新应用生成器会
创建新应用所需的一切。这个生成器的使用方法是,在终端窗口中进入工作空间目录,
然后输入:
$
rails new hello_rails
Rails
会创建一个应用骨架,然后执行
bundle install
令,安装默认的
Gemfile
文件
中声明的
gem
。你会看到大量
create
操作,最后是
Bundle
获取
gem
,解析依赖:
create
create README.rdoc
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
...
run bundle install
Fetching gem metadata from https://rubygems.org/...
Fetching additional metadata from https://rubygems.org/...
Resolving dependencies...
Using rake (10.3.2)
...
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
这些自动生成的文件和文件夹组成
Rails
应用的结构:
app/
这个文件夹存放应用的控制器、模型、视图、辅助模块、邮件程序和静态资源。
bin/
这个文件夹存放启动脚本,以及用于部署或运行应用的其他脚本。
config/
这个文件夹里的文件用于配置路由和数据库等。开发应用的不同功能时会陆续说明
这个文件夹里的文件。
config.ru
这个文件中是基于
Rack
的服务器的配置,用于启动应用。
Ruby on Rails
入门
35
db/
这个文件夹存放当前的数据库模式,以及数据库迁移文件。
Gemfile
这个文件指定
Rails
应用所需的
gem
依赖。
Gemfile.lock
Bundler
在这个文件中记录安装的各个
gem
的具体版本。在另一台设备中加载同一
个库或项目时,
bundle install
命令会查看
Gemfile.lock
文件,安装完全相同的版本,
而不会使用
Gemfile
文件,安装最新的版本。
lib/
这个文件夹存放扩展库。
log/
这个文件存放应用的日志。
public/
这个文件夹存放静态文件和编译后的静态资源文件。
Rakefile
这个文件定位并加载可在命令行中运行的任务。如果想添加任务,不能修改这个文件,
应该在应用的
lib/tasks
目录中添加文件。
README.rdoc
这是应用的简略说明。你应该编辑这个文件,告诉其他人这个应用的作用,以及安
装方式等。
test/
这个文件夹存放单元测试、固件文件和其他测试装置。详情参见第
7
章“测试
REST
式服务”一节。
tmp/
这个文件夹存放临时文件(例如缓存、
PID
和会话文件)。
vendor/
第三方代码放在这个文件夹里。在典型的
Rails
应用中,这里存放的通常是厂商自己
开发的
gem
现在,我们要检查新生成的应用能不能运行。为此,我们只需启动
Rails
服务器:
$
rails server
=> Booting WEBrick
=> Rails 4.0.4 application starting in development on
http://0.0.0.0:3000
36
2
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2014-07-21 13:29:27] INFO WEBrick 1.3.1
[2014-07-21 13:29:27] INFO ruby 1.9.3 (2013-11-22)
[x86_64-darwin13.0.2]
[2014-07-21 13:29:27] INFO WEBrick::HTTPServer#start:
pid=25171 port=3000
WEBrick
是随
Ruby
一起分发的默认
Web
服务器。为了查看应用,打开一个浏览器窗口,
访问
http://localhost:3000
。你应该看到如图
2-2
所示的页面。
2-2
Rails 应用的默认首页
现在该让
Rails
使用
JSON
格式打个招呼了。我们的计划是,编写一个非常简单的
API
只有一个端点。访问这个端点时,只返回一个打招呼的字符串。
第一步,编写一个简单的模型。这个模型不用存入数据库,只需生成一个
JSON
格式的
字符串。在
app/models/
文件夹中创建一个文件,命名为
hello.rb
我们要定义一个
Hello
类,然后在类里定义一个简单的
to_json
方法。这个方法的作用
很简单,返回一个
JSON
格式的字符串——
"{"hello": "<text>!"}"
require 'json'
class Hello
def to_json(text)
return JSON.parse("{\"hello\": \"#{text}!\"}")
end
end
Ruby on Rails
入门
37
此外,我们还要为应用生成一个控制器。在终端窗口中输入:
$
rails generate controller say hello
这个命令会生成一个名为
say
的控制器,并创建一个名为
hello
的操作:
create app/controllers/say_controller.rb
route get "say/hello"
invoke erb
create app/views/say
create app/views/say/hello.html.erb
invoke test_unit
create test/controllers/say_controller_test.rb
invoke helper
create app/helpers/say_helper.rb
invoke test_unit
create test/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
不仅生成了控制器文件,还生成了可能需要的
HTML
文件、测试文件、辅
助模块文件、
JavaScript
文件和
CSS
文件,这么做是为了确保应用骨架与标准的配置保
持一致。
当然,你可以删除不需要的文件。如果不想让
Rails
为你生成控制器和相关的文件,也
可以自己创建
say_controller.rb
文件,将其保存在
app/controllers/
文件夹里。
在你喜欢使用的编辑器中打开
app/controllers/say_controller.rb
文件,像下面这样修改:
class SayController < ApplicationController
def hello
@hello = Hello.new
if params[:user]
render :json => @hello.to_json(params[:user])
else
render :json => @hello.to_json("Rails")
end
end
end
这个生成器只会应答
JSON
格式的请求,返回一个打招呼的消息。如果在
URL
中添加
user
参数,会返回“
Hello
”。
如果想试一下,就启动
Rails
服务器,然后在浏览器中访问
http://localhost:3000/say/
hello.json?user=John
38
2
测试驱动开发
测试驱动开发(
Test-Driven Development
TDD
)是一种软件开发方式,建议先为代码
编写测试,然后编写真正的代码,让测试通过。
很多公司和开发者都采取
TDD
Rails
界更是如此。不过,一些人逐渐意识到,
TDD
适合通过单元测试实现的静态测试。单元测试指测试软件应用中的独立单元(例如一个
或多个模块或过程),检查其行为是否正确。
单元测试能确认单个模块自身的行为是正确的,这有利于增量式开发和重构,还能尽早
发现缺陷,可是很多应用是由数据驱动的,必须有特定的数据、配置和真正的代码才能
发现某些问题。此时,虽然仍能对模型做单元测试,但是把应用作为一个整体做功能测试,
为其提供真实的数据,这样才能充分测试代码。
Rails
框架从早期就积极拥抱测试。在某种程度上可以说,
TDD
根植于
Rails
。因为每个
应用都要操作数据库,所以为了提高测试效率,
Rails
会创建一个测试数据库,填充示例
数据。功能测试还能模拟浏览器请求,因此我们无需在浏览器中四处点击,就能确保应
用正常。
每次使
rails new application_name
命令新建
Rails
项目时,
Rails
都会创建
test/
文件夹,存放测试
test/
文件夹的结构已经划分好了
models
目录存放模型测试
controllers
目录存放控制器测试,
integration
目录存放涉及多个控制器交互的测试。
test
文件夹中还有一个子文件夹,名为
fixtures
,这里存放的是测试数据。
test
文件夹中
test_helper.rb
文件保存的是
Rails
应用默认的测试配置。
生成控制器时还会生成一个测试类,保存在
test/controllers/say_controller_test.rb
文件中。
默认情况下,这个文件中有个简单的测试,断言能成功调用所定义的方法:
require 'test_helper'
class SayControllerTest < ActionController::TestCase
test "should get hello" do
get :hello
assert_response :success
end
end
如果想运行应用的所有测试(此时,只有一个)就在终端窗口中执行
rake test
令:
$
rake test
# Running:
.
Finished in 0.045843s, 21.8136 runs/s, 21.8136 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips

Get RESTful Rails Development (中文版) now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.