本文很长, PPT写了6小时, 发布在慕课网又写了2小时。 希望大家看完第一节,再看这里。
阅读本文收获通过学习本文,可以知道路由是啥东西。它通用于所有语言, 也跟框架无关。 学习完本章, 你可以轻易熟悉其他框架的各种路由(例如 Angular route, Vuejs route, Spring MVC route, Struts route... )
总之,学习完Rails路由后,再看其他框架的路由, 都是一样的。 无非一些写起来啰嗦些/落后些, 一些更加简洁/先进些。
- 知道什么是路由
- 知道RESTful 思想。 (通用于所有语言/框架)
- 知道哪些路由是过时的,不需要学
路由是Rails框架的核心。它把model, controller, view 联合到了一起。 如果路由学不好,Rails就没法入门。
可惜的是, Rails的官方教程安排的不合理, 把最艰深晦涩的知识放在了前面,难以让新人入门,就算是老手入门也有很大难度。
所以,我把它安排在入门后的首要学习的内容。
事实上的http请求: GET/POST只有两种: GET/POST. 其他总共6种以上的请求类型, 都只是停留在纸面上。
POST 请求提交表单( <form>
) 时
点击url (<a>
标签)时
在浏览器地址栏输入url, 回车时.
首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。REST比SOAP以及XML-RPC更加简单明了。
我之前做过SOAP和 XML-RPC的项目。小小一个概念,就是不同系统间传递信息么,结果搞出一堆又一堆概念出来。特别无聊。
J2EE 中,专门有好多个jar包, 是为了实现soap 的。 结果用起来难用,学起来难学,还特别不好维护。
所以,千万不要学 SOAP / XML-RPC, 直接把时间用在刀刃上。
另外, RESTful 也是很多公司面试题目之一。(尽管它如此简单。。。)
通俗的概念认为浏览器请求的任何数据,都是资源(resources).
- 我们打开 "用户列表" 页时, 你请求的资源是”多个用户“
- 我们打开 "用户详情" 页时, 你请求的资源是”单个用户(小王)“
总共有4种请求: (掌握了下面四个动词的作用,你就知道了最核心的重点)
- GET : 仅用于查询
- POST: 仅用于新建
- PUT: 仅用于修改
- DELETE 仅用于 删除.
1.查看数据:
GET /books : 查看books 的列表
GET /books/2 : 查看 id = 2的book
GET /books?id=2 同上.(查看id=2 的book)
2.创建数据:
POST /books (参数: name = ‘三体’) 创建一本书
3.修改数据:
PUT /books/2 (参数: name = ‘黑暗森林’), 修改一本书。
4.删除数据:
DELETE /books/2 删除 id = 2的 书.
RESTful 最大的特点: 相同的URL, 不同的请求类型
以下操作的 URL 都是相同的(都是 /books/2
。request的类型是不同的, 分成: GET, UPDATE, DELETE)
1.查看数据:
GET /books/2 : 查看 id = 2的book
2.修改数据:
PUT /books/2 (name = ‘黑暗森林’)
3.删除数据:
DELETE /books/2 删除 id = 2的 书.
WEB编程的核心: 增删改查,也叫: CRUD
CRUD: , create, read, update, delete
Rails中的CRUD在Rails中,系统默认每个controller有这样的操作:
回到Rails 项目: 实现不同的URL的跳转。我们用第一课的例子作为基础,实现两个不同页面的跳转,来说明什么是路由(简单一些,我们只看 GET路由)
1.下载第一课的rails项目.
$ git clone https://github.com/sg552/rails_lesson_1_setup_and_run
2.我们为books
controller 增加new
action,它的作用是处理 /books/new
这个url.
class BooksController < ApplicationController
# 增加这个新的action
def new
end
end
3.该修改路由了。回顾下 config/routes.rb
文件:
Rails.application.routes.draw do
# 这里会生成七种路由.
resources :books do
collection do
# 在这里生成第八种路由: GET: /books/list
get :list
end
end
end
有的同学会问: 是不是new
跟list
一样, 我们要写 get :new
这个路由呢? 不是的。 这个new
路由是已经存在的。
这就要讲到Rails中路由的最重要标志:(也叫定义路由的方法) resources
(敲黑板!)
resources
接下来,我们要大量的与它打交道, 可以说,rails中95%都是这种路由。
一行代码默认定义7种路由
resources :books
上面一句,就直接定义了7种路由:
通过rake routes
来查看所有的路由
在Rails中, 我们可以通过下面的命令查看所有的路由:
# 根目录下运行。 bundle exec 是命令前缀,加上它是好习惯
$bundle exec rake routes
所以,路由文件: config/routes.rb
:
Rails.application.routes.draw do
# 这里会生成七种路由.
resources :books do
collection do
# 在这里生成第八种路由: GET: /books/list
get :list
end
end
end
会生成:
为了大家 看的方便, 我在上图中增加了部分注释:
1.增加了前缀(prefix)列中原来省略的内容
2.去掉了URI pattern中无用的 .format
3.删掉了PATCH(它跟PUT一模一样,所以精简掉它)
可以看到:
- Prefix: 第一列,表示前缀。 这个前缀可以后接
_path
或者_url
. 例如,new_book_path
就会被Rails识别成/books/new
- Verb: 第二列,表示request的类型,可以看到, 有:
GET
,POST
,UPDATE
,DELETE
. (可以无视那个PATCH
, 暂时认为它跟PUT
一模一样。 ) - URI Pattern: 第三列。 URL的匹配模式。 其中的 :id 表示参数,例如:
/books/:id/edit
就会匹配到/books/2/edit
或者books/100/edit
, 匹配完后, Rails会自动认为上面的2
,100
都是 id 参数。 - Controller#Action; 第四列。 告诉我们这个URL会触发的 controller/action都是什么。
所以, 一个 resources
, 就定义了:
- new
- show
- index
- create
- edit
- update
- destroy
总共7个 从 url 到 action的 对应关系.
多出来的那个get :list
路由呢?
get :list
会多定义出来一个: list_book
这个 url. (请把目光回到路由列表图, Prefix: list_books 那一行, 就是被定义出来的路由。我把它在下面写出来:)
Prefix Verb URI Pattern Controller#Action
list_books GET /books/list books#list
恭喜大家, Rails路由中 最难懂的部分已经解释完了。 我们继续回到Rails项目中。
4.为 new 这个action增加一个新页面.
前面的路由知识铺垫完了,我们继续创建第二个页面。
我们新建文件: app/views/books/new.html.erb
<h3>新建图书页</h3>
<!-- 这个 form 的内容不用看 -->
<form action="" method="POST">
请输入书名:
<input type='text' name='book_name'/>
<input type='submit' value='确定'/>
</form>
<br/>
<!-- 重点看这个 a link -->
<a href='/books/list'>返回</a>
虽然名字后缀叫 .html.erb
, 但这是个最普通的html 文件. (所有同学都能看懂,我就不解释了)
这个页面,可以跳转到: 第一个页面。 (/books/list
)
5.访问这个 "新建图书页" (new
页)
5.1 启动rails ( 还记得命令吗? $ bundle exec rails server
)
5.2 打开浏览器,访问 url: /books/new
5.3 可以看到, 出现了页面:
6.实现页面的互相跳转.
6.1 我们修改 /books/list
url 对应的 页面 (app/views/books/list.html.erb
), 增加一个a link: <a href='/books/new'>新建图书页</a>
<h3> 下面的代码,都是由 RUBY代码生成的</h3>
<% books = ['三体1 - 地球往事', '三体2 - 黑暗森林', '三体3 - 死神永生'] %>
<% books.each do book %>
<p> <%= book %> </p>
<% end %>
<!-- 增加了这一行: -->
<a href='/books/new'>新建图书页</a>
6.2 打开浏览器,访问: /books/list
, 可以看到,页面的最下方也出现了一个链接。
6.3 点击之后,就可以实现两个页面的跳转了!
(第二节: 路由(上)完)
本节源代码本节中的例子,对应的源代码,可以来这里下载:
https://github.com/sg552/rails_lesson_2_route
本节对应的ppt, 可以来这里下载:
热门评论
顶一个,没有人评论还