Rails Rails 5 架构深入理解

lilijreey · 发布于 2016年08月26日 · 最后由 ACzero 回复于 2016年08月30日 · 2331 次阅读
24996

陆陆续续用了有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

持续更新中...

共收到 14 条回复
121

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

从以下几点来学习:

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

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

24996

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

28195

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

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

24996

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

11524

看到4L我笑了肿么办。

14293

推荐一份 PPT rails-5-features

28195

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

5023

科研人员自学rails的路过

A908ae

要不你弄个repo好了

6829

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

22720

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

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册