本文转载,来自http://ihower.tw/blog/archives/4561
新的 Rails3 Controller 重构后,变成 ActionController::Base < ActionController::Metal < AbstractController 的继承体系。除了 ActionMailer 继承自 AbstractController,让 API 与 Controller 一致之外,新的 ActionController::Metal 更是充满玩味。
故事可以从上个礼拜,Yehuda 把 Rails 2 的 Metal 移除了(commit),根据 commit 的说明,Rails 2 的 Metal 在 Rails 3 里面,可以用 1. 放在 Route 之前的 Rack middleware 或 2. 放在 Route 之后的一个 Rack endpoint,而这个 Rack endpoint,除了自己实作 Rack app,我们也可以用 ActionController::Metal 来实作出自己的客制化 Controller。
Rails2 发明 Metal 原因是,有些事情不需要完整的 Controller 功能,希望能够越快越好,例如 XML/JSON API 等。而 Rails2 的 Metal 虽然非常快,但是没什 弹性,完全不能使用 Controller 的功能,例如用 Layout, Template, Sessions 等,基本上就跟单纯的 Rack middleware 没什 两样。但是在 Rails3 中,可以透过自继承 ActionController::Metal 做出白纸般的客制 Controller,可以有非常快的速度,如果有需要用到 Controller 的功能,也可以任意选择组合加入,十分弹性。
例如,我们来实作一个超级精简的 Static Controller:
# lib/static_controller.rb class StaticController < ActionController::Metal include ActionController::Rendering append_view_path "#{Rails.root}/app/views" def about render "about" end end # config/route.rb match '/about', :to => "static#about", :as => :about
这个范例有接近于 Metal 的速度,并加入了 Controller 的 Template 功能 (你可以参考 ActionController::Base 这是拥有全部功能的版本)。其中 “static#about” 是 StaticController 的 about action 缩写,而在 Rails3 中,controller action 也都是一个 Rack app。
如果你在 Rails3 中不需要全部的 Controller 的功能,想要尽量拉高效能,有几种推荐作法:
* 写成 Rack Middleware,然后在 config/application.rb 中插入 config.middleware.use YourMiddleWare
* 写成 Rack App,在 config.route.rb 中将某个对应的网址指到这个 Rack App
* 继承自 ActionController::Metal 实作一个 Controller,其中的 action 也是一个 Rack App
其中的差异就在于后两者会在 Rails Route 之后(好处是统一由 route.rb 管理 URL 路径),如果继承自 ActionController::Metal 可以有弹性获得更多 Controller 功能。原则上,我想我会推荐 ActionController::Metal,写起来最为简单,一致性跟维护性较高。
另外,还有个小玩意, ActionController::Middleware 是 Controller 层级的 Rack Middleware,让你可以在放入到某个特定 Controller 之中(也就是只有该 Controller 使用这个 Middleware)。不过呢,这个功能我到现在还没看到任何实用的例子就是了。
最后,Yehuda 提供了一个 参考数据:
fast: through middleware inserted at 0 slwr: through middleware inserted via @use@ rotr: through endpoint sent via the router bare: through ActionController::Metal with self.response_body cntr: through ActionController::Base with self.response_body text: through ActionController::Base with render :text tmpl: through ActionController::Base with simple render :template layt: through ActionController::Base with render :template with layout real rps fast 0.004271 2900 Rack 极限 slwr 0.067029 2200 使用 config.middleware.use YourMiddleware rotr 0.088085 2000 经过 Rails Route 之后 bare 0.103868 1900 使用 ActionController::Metal 的最快速度 cntr 0.355898 1070 使用 ActionController::Base 的最快速度 text 0.557127 825 使用 ActionController::Base 加上 render :text tmpl 0.639581 765 使用 ActionController::Base 加上 render :template layt 1.678789 375 使用 ActionController::Base 加上 Template 跟 Layout
相关推荐
Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...
本书教您如何使用Ruby on Rails开发和部署真正的,具有工业实力的Web应用程序,Ruby on Rails是为诸如Twitter,Hulu,GitHub和Yellow Pages等顶级网站提供支持的开源Web框架。
Rails Plugins:Extending Rails Beyond the Core
gem "mongoid_rails_migrations" 如何使用 创建迁移 $ rails generate mongoid:migration 运行迁移: $ rails db:migrate $ rails db:migrate:down VERSION= $ rails db:migrate:up VERSION= $ rails db:rollback...
- **步骤**:通过命令行使用`rails new project_name`来初始化一个新的Rails项目。 - **结构**:新项目将包含默认的目录结构,如`app`、`config`、`db`等,分别用于存放应用程序代码、配置文件、数据库迁移脚本等。 ...
1. Rails 3.0: Rails 3是重大升级,引入了ActionController::Metal,这是一个轻量级的控制器,用于提高性能。同时,它引入了多路由引擎支持,如Rack中间件,使得与其他Web服务器的集成更加容易。此外,ActiveRecord...
### Flexible Rails: Flex3 on Rails2 #### 关于Flexible Rails 本书《Flexible Rails: Flex 3 on Rails 2》由Peter Armstrong撰写,旨在探讨如何结合使用Flex 3和Rails 2来开发高效的富互联网应用程序(Rich ...
3. **社区活跃**:Rails拥有庞大的开发者社区,提供了丰富的插件和教程资源,遇到问题时可以迅速获得帮助。 4. **安全性**:Rails内置了一系列安全措施,比如防止SQL注入、XSS攻击等,有助于保护应用免受常见威胁。 ...
This pioneering book is the first resource that deep dives into the new Rails 3 APIs and shows you how use them to write better web applications and make your day-to-day work with Rails more ...
“开发人员的笔记本”记录了一些准则,技术和想法,这些准则,技术和想法将经典的面向对象的思想应用于Ruby on Rails应用程序。
附上Jamis的rdoc模板文件,tar解压即可。 博文链接:https://lgn21st.iteye.com/blog/199681
Learn Web Development with Rails Clear EPUB version in English, Second Edition “The author is clearly an expert at the Ruby language and the Rails framework, but more than that, he is a working ...
SwaggerYard :: Rails SwaggerYard :: Rails gem是一个Rails引擎,旨在使用SwaggerYard解析您的Yardocs API控制器。 它将创建一个Swagger-UI投诉JSON,以通过安装... gem 'swagger-ui_rails2' , github : '3scal
RAILS v1.5.1 和 Cobbler v0.6.1 雷内 L.沃伦,2014-2021 电子邮件:bcgsc.ca 的 rwarren 名称 RAILS: Radial Assembly Improvement by Long Sequence Scaffolding Cobbler: Gap-filling with long sequences 描述 ...
链轮滑轨 提供用于Rails 4.x(及更高版本)资产管道的Sprockets实现。... 在进行滚动部署时很有用,该滚动部署在编译新资产时可能仍在为旧资产提供服务。 rake assets:clobber Nuke public/assets 。 定制