Rails Rails 5 架构深入理解

lilijreey · August 26, 2016 · Last by ACzero replied at August 30, 2016 · 4337 hits

陆陆续续用了有2年 Rails. 越来越感觉到有些力不从心. 很多功能只停留在能用,并不知道是如何设计的.更无法对 Rails 整体有一个 清晰的把握. 感觉要用好 Rails 必须了解 Rails 的实现,否则心虚. 搜索了一下这方面的资源不太多. 希望大神们提供一些这方面的学习资料.让大家更好的学习和理解 Rails.

1.上路 要理解 Rails 的设计思想和实现架构,首先需要对 Rack 有一个清晰的认识.因为 Rails 是一个 Rack 应用.他离不开 Rack 的设计模式.所有要高清 Rails,还是得先搞懂 Rack.

  1. Rack 的设计意图与实现模式 Rack 本身做为 web 应用与 web 服务器的中间层,核心目的是隔离不同 webServer 的实现差异以及为 web 应用提供一个屏蔽 webSever 的抽象环境. 知道了 Rack 的设计意图后,我们来看看 Rack 的实现方法. 网上有很多相关资料.请在 google 搜索. "ruby rack inside" "ruby rack middleware" 查看 see http://pothibo.com/2013/11/ruby-on-rails-inside-actiondispatch-and-rack/
    https://www.amberbit.com/blog/2011/07/13/introduction-to-rack-middleware/

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 参数,返回一个三元数据.对应元素为

  1. HTTP 响应码,
  2. 响应头-> Hash
  3. 响应 body 对象,需要能够有.each 方法 总结:Rack 本质 1.为 app 的托管环境,屏蔽 webServer,2提供了一个基于装饰者模式的中间件机制.为应用的实现提供了一种零活的可复用的架构.这种方式本身也是对 HTTP 处理流程的抽象.

3

ActiveSupport Gem

提供了一些工具类,和对内置类型的 monkypatch autoload 重写了 autoload Rails 中大量使用 不需要第二个文件参数,根据默认规则自动加载文件

4

ActionPack Gem

Action Pack is a framework for handling and responding to web requests. 主要包含三部分

  • 提供路由机制 ActionDispatch
  • 提供 controller 基类 ActionController
  • 文件渲染 Render

4.1 ####ActionDispatch::Joureny 分析参考 https://ruby-china.org/topics/30929

持续更新中...

先祝贺一下你马上有技术突破了。

从以下几点来学习:

  1. 尝试阅读 Rails 源代码。这里有很多技巧和经验,可自行了解下。
  2. 有从 0 到 1 构建 Rails, 国外有一个教程可以学习一下
  3. 尝试写一些 gem 来理解它们。

预告一个小广告,我们正在筹备一个 80 学院,关于一对一在线教学的,帮助 Rails 初级工程师进阶。

#1 楼 @lyfi2003 👍 3各月拿下 Rails. 之后会整理出个笔记.

我是 ruby 和 rails 新手,不太好评价什么了。我个人自学的经历来看,自学的效率(我自学过的 Codecademy, the odin project, ruby on rails tutorial 等等)远远不及参加专业的机构培训(当然不是国内某些骗钱的培训机构)。对我来说,我强烈的感觉问题关键不在于资料太少,而是资料太多。多到我完全不知道如何吸收消化。因此我并不准备给楼主推荐很多资料。我推荐楼主如果英语水平可以的话可以考虑参加美国的在线课程进行培训,推荐一个我现在正在参加的 Full Stack 培训项目Viking Code School. 课程的主体以 rails 为后端 Angular JS 为前端。当然我的选择不一定适合楼主,这类专业培训机构很多,这里只是想说其实除了自学之外,适当的参加一些培训,也许会有别样的收获。

PS: 其实我真正的目的是想给自己找个小伙伴😜 ,毕竟全中国就我一个人在那上课,每天倒时差和他们交流也是有点蛋疼。

#3 楼 @BranLiang 你我水平不是一个次元的.不过还是谢谢你.

看到 4L 我笑了肿么办。

#4 楼 @lilijreey 有点尴尬。。。妈蛋💢,好吧,我承认是在下输了。吓得我赶紧去查看了一下楼主的 Github,🙄 然并没有发现超次元的存在

科研人员自学 rails 的路过

要不你弄个 repo 好了

#7 楼 @BranLiang 他意思是你的次元要高点

#1 楼 @lyfi2003 请问“0 到 1 构建 Rails”这个教程的标题是什么?我试着搜了一些标题都找不到😂

You need to Sign in before reply, if you don't have an account, please Sign up first.