约定优于配置和RESTful是Ruby on Rails十分推崇的哲学。在一个默认的RESTful的Rails项目中,使用资源和HTTP动词来帮助组织项目。
假如有一个使用scaffold
创建的Rails项目,它的创建代码像下面这样:
rails new hello_rails
cd hello_rails/
rails generate scaffold person name:string
执行之后得到的文件结构如下(原文来自Ruby on Rails 指南):
-
app/
存放程序的控制器、模型、视图、帮助方法、邮件和静态资源文件。本文主要关注的是这个文件夹。 -
bin/
存放运行程序的 rails 脚本,以及其他用来部署或运行程序的脚本。 -
config/
设置程序的路由,数据库等。详情参阅“设置 Rails 程序”一文。 -
config.ru
基于 Rack 服务器的程序设置,用来启动程序。 -
db/
存放当前数据库的模式,以及数据库迁移文件。 -
Gemfile, Gemfile.lock
这两个文件用来指定程序所需的 gem 依赖件,用于 Bundler gem。关于 Bundler 的详细介绍,请访问 Bundler 官网。 -
lib/
程序的扩展模块。 -
log/
程序的日志文件。 -
public/
唯一对外开放的文件夹,存放静态文件和编译后的资源文件。 -
Rakefile
保存并加载可在命令行中执行的任务。任务在 Rails 的各组件中定义。如果想添加自己的任务,不要修改这个文件,把任务保存在 lib/tasks 文件夹中。
README.rdoc 程序的简单说明。你应该修改这个文件,告诉其他人这个程序的作用,如何安装等。 -
test/
单元测试,固件等测试用文件。详情参阅“测试 Rails 程序”一文。 -
tmp/
临时文件,例如缓存,PID,会话文件。 -
vendor/
存放第三方代码。经常用来放第三方 gem。
项目中最常用的是app/
这个目录,在它下面又有MVC模型的controllers/
、views/
、models/
等几个子目录。
在controllers/
下面有people_controller.rb
文件,其中的类叫做PeopleController
。Rails约定,控制器中的命名默认为复数,如果你没有在路由中指定其他的控制器的话。我们创建的模型叫person,所以它的复数就是people。
在控制器中有index
、show
、new
、edit
、create
、update
、destroy
等方法,这些方法叫做控制器的动作。
在models/
下面有person.rb
。Rails约定模型名默认是单数。打开这个文件后,里面却什么都没有。
class Person < ActiveRecord::Base
end
这是因为在Rails中,模型的内容是随着数据库中对应的表变化的,这一点和其他的ORM略有不同。如果需要修改模型的内容,只需修改数据库即可。而修改数据库并不需要手工去做,Rails中有迁移(migration)这个机制可以帮助我们实现。好处一是我们的修改是数据库无关的;二是可以方便做版本控制。
打开db/migrate/*_create_people.rb
。这段代码创建了一张people表:
class CreatePeople < ActiveRecord::Migration
def change
create_table :people do |t|
t.string :name
t.timestamps
end
end
end
我们执行bin/rails db:migrate
命名来执行迁移,这时Rails在后台建立了people表,使用的是config/database.yaml
中设置的数据库,默认就是SQLite。
最后看一下views/
目录。在它下面除了和布局相关的layouts/
,就是people/
目录。其中有以.html.erb
为后缀的index
、new
、show
、edit
等文件。这些文件都和控制器的动作相关联。把它们关联在一起的就是Rails的路由设置config/routes.rb
。
这里面只有一条规则,
resources :people
创建了people这个资源。Rails使用资源来实现REST。它实际上等价于下面的几条规则:
或者借用Ruby on Rails 实战圣经的这个表格更好认识(原图中资源为events):
(本文系原创,同步自我的博客园)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。