继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Web开发的王者: Rails 教程. 2. 路由(上) (思维原创)

申思维
关注TA
已关注
手记 28
粉丝 422
获赞 3787
目录

安装Linux + Win 7 双系统

Ruby Lesson 1: 初识

Ruby Lesson 2: 基础知识

Ruby Lesson 3: 进阶

Rails Lesson 1. 入门

Rails Lesson 2. 路由-上

Rails Lesson 2. 路由-下

本文很长, PPT写了6小时, 发布在慕课网又写了2小时。 希望大家看完第一节,再看这里。

阅读本文收获

通过学习本文,可以知道路由是啥东西。它通用于所有语言, 也跟框架无关。 学习完本章, 你可以轻易熟悉其他框架的各种路由(例如 Angular route, Vuejs route, Spring MVC route, Struts route... )

总之,学习完Rails路由后,再看其他框架的路由, 都是一样的。 无非一些写起来啰嗦些/落后些, 一些更加简洁/先进些。

  1. 知道什么是路由
  2. 知道RESTful 思想。 (通用于所有语言/框架)
  3. 知道哪些路由是过时的,不需要学
先学习它的意义。

路由是Rails框架的核心。它把model, controller, view 联合到了一起。 如果路由学不好,Rails就没法入门。

可惜的是, Rails的官方教程安排的不合理, 把最艰深晦涩的知识放在了前面,难以让新人入门,就算是老手入门也有很大难度。

所以,我把它安排在入门后的首要学习的内容。

事实上的http请求: GET/POST

只有两种: GET/POST. 其他总共6种以上的请求类型, 都只是停留在纸面上。

POST 请求

提交表单( <form>) 时

GET请求

点击url (<a> 标签)时
在浏览器地址栏输入url, 回车时.

RESTful 请求

首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。REST比SOAP以及XML-RPC更加简单明了。

我之前做过SOAP和 XML-RPC的项目。小小一个概念,就是不同系统间传递信息么,结果搞出一堆又一堆概念出来。特别无聊。

J2EE 中,专门有好多个jar包, 是为了实现soap 的。 结果用起来难用,学起来难学,还特别不好维护。

所以,千万不要学 SOAP / XML-RPC, 直接把时间用在刀刃上。

另外, RESTful 也是很多公司面试题目之一。(尽管它如此简单。。。)

通俗的概念

认为浏览器请求的任何数据,都是资源(resources).

  • 我们打开 "用户列表" 页时, 你请求的资源是”多个用户“
  • 我们打开 "用户详情" 页时, 你请求的资源是”单个用户(小王)“

总共有4种请求: (掌握了下面四个动词的作用,你就知道了最核心的重点)

  1. GET : 仅用于查询
  2. POST: 仅用于新建
  3. PUT: 仅用于修改
  4. DELETE 仅用于 删除.
几个RESTful的例子

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

有的同学会问: 是不是newlist一样, 我们要写 get :new 这个路由呢? 不是的。 这个new路由是已经存在的。

这就要讲到Rails中路由的最重要标志:(也叫定义路由的方法) resources
(敲黑板!)

Rails中的最重要定义路由的方法: 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, 可以来这里下载:

http://siwei.me/about-me/speaks

打开App,阅读手记
20人推荐
发表评论
随时随地看视频慕课网APP

热门评论

顶一个,没有人评论还

查看全部评论