陆陆续续用了有2年 Rails. 越来越感觉到有些力不从心. 很多功能只停留在能用,并不知道是如何设计的.更无法对 Rails 整体有一个 清晰的把握. 感觉要用好 Rails 必须了解 Rails 的实现,否则心虚. 搜索了一下这方面的资源不太多. 希望大神们提供一些这方面的学习资料.让大家更好的学习和理解 Rails.
1.上路 要理解 Rails 的设计思想和实现架构,首先需要对 Rack 有一个清晰的认识.因为 Rails 是一个 Rack 应用.他离不开 Rack 的设计模式.所有要高清 Rails,还是得先搞懂 Rack.
2.1 Rack 的实现模式 1.Web Server 的抽象. Rack 对于 WebSever 的抽象层面很高,他并不对 webApp 提供 WebServer 的抽象,而是把 webServer 的一下重要信息和 HTTP 协议信息封装在一个 env 对象中. 进行抽象. 应用只需要访问 env 对象就能得到几乎所有的环境信息. 2.中间件模式 在 web 应用中有一些功能是很常用的,比如静态文件处理,压缩功能,url 的路由,等等,由于这些功能如此常用和独立.显而易见我们我们每个人不肯能,在自己为这些功能重复造轮子. 类似的其实我的的 app 和前面的常用功能在处理层面上是平行的.所以 Rack 在设计上,不仅提供的为我们提供了 webServer 的抽象还提供了一种能打包独立功能和重用这些功能的机制.Rack 用装饰着模式来实现这种功能,每个独立的功能叫做中间件(middleware). 试着对你的 rails 项目执行 rake middleware. 你会看到当前 Rails 项目所使用的所有中间件.从这点我们可以看成,Rails app 不过是一些列 Rack 中间件的组合.
### 中间件的工作方式
中间件之间像是套娃一样,一个包裹着一个
middle1 begin
middle2 begin
middle 3 begin
app
middle 3 end
middle 2 end
middle 1 end
注意每一层的milldeware都有可能独自拦截请求,而不往下转发
比如Rack::Static
Rack 把很多常用的 web 功能都做成中间件,包含在 Rack 项目中了.比如 Etag,SendFile,Directory. 请自行查看源码
2.2 中间件 由于所有 web app 的功能都是由不同中间件组成.那么这些中间件之间必须遵循统一的接口规范. Rack 的所有中间件包括 app(最里面的中间件)都是一个 ruby 对象.接口规范为:这个对象必须能够相应.call(env) 方法 env 就是当前的环境.call 方法返回一个三元数组.只接受一个 env 参数,返回一个三元数据.对应元素为
3
提供了一些工具类,和对内置类型的 monkypatch autoload 重写了 autoload Rails 中大量使用 不需要第二个文件参数,根据默认规则自动加载文件
4
Action Pack is a framework for handling and responding to web requests. 主要包含三部分
4.1 ####ActionDispatch::Joureny 分析参考 https://ruby-china.org/topics/30929
持续更新中...