`
fireflyman
  • 浏览: 118296 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

<转>Rails3 Beta 发布: 重点导览

    博客分类:
  • ROR
阅读更多

 

Merb Rails 决定合并开始,过了一年多的努力终于发布 Beta 版啦。Rails3 最重要的人物就是总架构师 Yehuda Katz 了,整个把 Rails core 翻了好几翻,彻底改头换面。

Why?
我是这么想的,DHH 一开始开发 Rails 的时候,Ruby 社群还不像现在这么发达,所以很多事情必须自己造(prototype 都是为了 Rails 而造的),为了达到非常容易设定跟快速开发的理想,得包山包海什么功能都要做,再加上有限的资源,造成了 Rails core 其实绑得很紧,基本上就是一整包给你。要修改扩充它,常常就必须 monkeypatch 一下。另一方面,对怎样的 Ruby 程序是好程序,一开始也没有这么多人想清楚,例如 Rails core 充满了 alias_method_chain,这件事情现在也被认为是比较不好的写法。

Rails3
的时代不同了,Ruby 社群起来了。我们有标准的 Rack 界面、我们有不同的ORM甚至是 NoSQL 的储存库、我们有不同 JS Libary、我们有不同测试方式 RSpec、我们也有许多现成不需要自己造的新函式库。Rails3 基本上就是这么一个接近改掉重写的版本,但是以重构的方式达成了这个兼容并蓄的目标:将 API 重新厘清、彻底模块化、低耦合度组件、大幅提升效能等。具体来说,有几个成果:


使用 Ruby 1.8.7 Ruby 1.9

1.9
的时代终于要来临了可以复习一下我去年演讲的投影片


Dependencies
管理

本来的 config.gem 换成新的 Bundler 来管理所有用到的函式库,使用新的 Gemfiles 格式,本来的 config.gem sucks 问题多功能有限。现在,我们真的做到可以完全不依靠系统 gems。可以参考这篇 Bundle me some Rails 示范 Bundle 的用法


新的 Routes

由于全面导入 Rack 的关系,现在的 Route 其实也是一个 Rack middleware,实作上就是 rack-mount。新的 Route 第一眼看到就是 API 的改变了,可以参考这篇 Revamped Routes in Rails 3 ,不过这其实不是最重要的地方,最厉害的地方是,它参数 :to 接的端点其实是 rack 端点,而 main#home MainController.action(:home) 的简写( 是的!! Rails3 中每个 Controller actions 全都是一个标准的 Rack app!! 超酷!!),可以看看 Yehuda 实作说明 。既然是 Rack 端点,我们就可以给它接其它 Rack app,例如 Sinatra,这一篇就示范了怎么接 Rails 3 Routing with Rack ,真是超级简单啊。我们可以预期,会有更多有趣的 Rack middlewares 可以与 Rails 结合。

另外,我们也可以直接在 Routes 层直接办到 redirect render template,可以看看 Yehuda 的实作说明:Generic Actions in Rails 3 ,基本上就是简单的 Rack middleware


新的 Active Model

为了达到与不同 ORM 衔接的目标,Rails3 ActiveModel 将本来的 ActiveRecord 的个别功能抽出来成为 Module,例如 callbacks, validations, serialization, observing, dirty tracking 等。任何 Class 只要符合 ActiveModel 定义的几个 API,再加上 include 你需要的 Module,就可以与 Rails3 接在一起了。请参阅 ActiveModel: Make Any Ruby Object Feel Like ActiveRecord

其中 Validation 有新的 API,请参阅 validates :rails_3, :awesome => true


ActiveRecord


ActiveRecord 本身呢? 引入了 ARel 这套 SQL 产生工具(why Arel?),大幅采用 “method chain” 的串接用法,让每个操作都变成了 scope

ActiveRecord
因此也有了新的 API: Active Record Query Interface 3.0


ActionController

Responder
带来了 respond_with,可以简化 controller 的写法,用法参考 Cleaner RESTful Controllers w/ respond_with Default RESTful Rendering Three reasons to love ActionController::Responder 这几篇。这工具非常有趣,我之前甚至写了一个 plugin respond_methods 来让 Rails 2.x 支持这个功能。

另外,新的 Render 实作可以让你轻易扩展,这一篇 Render Options in Rails 3 示范了怎么做出你自己的 render :pdf


ActionView

几个大的改变:

1.
采用 Erubis 实作
2.
预设 XSS protection 打开,再也不用忘记加上 h 逸出了。请参考 SafeBuffers and Rails 3.0 有更多细节
3.
将所有 JavaScript helpers 改成 unobtrusive。你会发现 Rails3 public/javascripts 多了一个 rails.js,这就是一个 JS driver,预设是接 prototype.js,要换成 jQuery 非常简单,只要用 jQuery 版本的 rails.js 就可以了。因此本来的一些 Ajax Helper 就被移除了,有需要的话可以在 prototype_legacy_helper plugin 找回来。
4. Helpers
预设输出格式是 HTML 5

说到 HTML5,我另外推荐这份阅读材料 Dive into HTML5 以及 HTML 5 Demos and Examples


ActionMailer

首先底层换成 Mail 这套工具了,可以参考这篇介绍。接着,受益于 Controller 的重构成果,新的 ActionMailer 终于和 Controller 继承自同一个 AbstractController,让 ActionMailer 的功能增加不少,也大大的 DRY 了。

新的 API 请参考 New ActionMailer API in Rails 3.0

最后它的位置改放在 app/mailers 了,放在 app/models 下实在让人搞混啊。


ActiveSupport

之前的 ActiveSupport 有个讨厌的地方是,如果你只想要用到其中的几个功能,很不容易搞懂到底要 require 哪些东西,最后只好通通载入以求保险。新的 Rails3 把这件事情弄清楚了,你可以只加载你要的部分。


Rails Application object

为了让一个 Process 可以跑多个 Rails appRails3 使用了一个 Rails Application 对象来表示一整个 Application 的所有设定,因此本来的 config/environment.rb 的功能,几乎都搬到 config/application.rb 了。另外,Rack 的标准 config.ru 档案也被加到了根目录,因此要特别注意到你的 Application 名称,这会是跟其它 Application 互动时使用的名称,预设是目录的名字。


新的 Rails Module

几个常数被拿掉了,RAILS_ROOT 要改用 Rails.rootRAILS_ENV 要改用 Rails.envRAILS_DEFAULT_LOGGER 要改用 Rails.logger 等,详细请参阅这篇 The Rails Module (in Rails 3) 。改成对象的好处是,我们就不需要做字符串操作这种事情了。


新的 rails 指令

本来的 script/* 指令全部拿掉了,都改成用 rails。例如 script/console 变成 rails console (可以简写成 rails c)script/generate 变成 rails generate (可以简写成 rails g)script/server 变成 rails server(可以简写成 rails s)。使用 rails –help 可以看到完整说明。


推荐阅读

Rails3
的阅读资料非常多,官方的 Rails 3.0: Release Notes 是必读。如果你从升级的方向切入,可以使用官方的升级 Plugin rails-upgrade is now an official plugin ,它可以帮助你 1. 检查需要升级的地方 2. 产生 Gemfile 3. 产生新的 routes.rb。请搭配这篇 The Path to Rails 3: Approaching the upgrade 服用。不过,嗯,现在还是不要在 Production 环境上升级比较好,毕竟很多 Plugin 还没跟上来哩 (可以看看 Is Your Plugin Ready For Rails 3? Rails Wiki 有整理哪些 Plugins OK )

如果是从重新开始会容易得多,可以看 The Path to Rails 3: Greenfielding new apps with the Rails 3 beta 这篇。十分建议你有空的话,现在就可以开始玩玩看了。


如果想多了解 Rails 的架构,有几篇文章可以看看:

    * The Path to Rails 3: Introduction (
算是最简单的一篇,可以看看)
    * Rails 3 Beta is Out — A Retrospective
    * Rails 3: The Great Decoupling
    * Rails Edge Architecture
    * Rails and Merb Merge: The Anniversary (Part 1 of 6)
    * Rails and Merb Merge: Performance (Part 2 of 6)
    * Rails and Merb Merge: Plugin API (Part 3 of 6)
    * Rails and Merb Merge: Rails Core (Part 4 of 6)

最后,如果你还想找更多,英文的懒人包有:Rails 3.0 Beta: 36 Links and Resources To Get You Going Rails 3 Reading Material On the way to Rails 3 – a link list

 

写道

http://liuming.iteye.com/blog/578339
忽然发现这篇更详细,各位可参考~

 

分享到:
评论
12 楼 klfo 2010-08-06  
很高兴进入你的空间 备注下

共同学习

11 楼 山雨欲来风满楼 2010-02-28  
看了一下,原来插件是通过Generator来统一处理了
http://blog.plataformatec.com.br/2010/01/discovering-rails-3-generators/
http://caffeinedd.com/guides/331-making-generators-for-rails-3-with-thor

用哪个什么thor,可以调用所有rails 框架调用的东西,好像和产生一个新的应用有点像,最后可以打包成Gem来安装

如果插件能够很方便的替换和升级,而不影响其他插件和组件,那么Rails的大发展就一定会到来了,软件的可重用性和可维护性问题如果很方便可以解决了,这可是多少人梦寐以求的啊,继续研究
10 楼 山雨欲来风满楼 2010-02-28  
用插件方式来开发怎么弄的啊, 原来2.3的插件说明还行不行啊?看不懂
http://weblog.rubyonrails.org/2010/2/9/plugin-authors-toward-a-better-future
这个里面说的。

说是用Railties但是又有什么限制,搞不懂这些高深的,查了很多地方,都没有很清楚的说明Rails 3 插件是如何开发的。

9 楼 山雨欲来风满楼 2010-02-25  
到处都是 Rack, 这东西思想简单, 用起来转个弯的,没有很好的学习资料
8 楼 justps 2010-02-23  
可不可以直接跳过2用3啊?变化太大,以前的积蓄都不管用了。
7 楼 shuxiang 2010-02-23  
有很多新概念出现,都看不懂了
6 楼 orcl_zhang 2010-02-20  
看完了,不错哦。有了大概的一个认识。
看了railscast刚出来的两篇,关于rvm和bundler的介绍。
我的装上去报一些错,暂时先不折腾了。
等待正式版出来吧。

5 楼 rainlife 2010-02-10  
darkbaby123 写道
Prototype是为了Rails而造的?但似乎Prototype出现的时间比Rails要早吧?
补充:刚查了一下,还真有这回事……

一开始是为了在rails中提供相应的ajax方面的应用而开发的,不过现在已经是一个独立的项目了。
4 楼 darkbaby123 2010-02-10  
Prototype是为了Rails而造的?但似乎Prototype出现的时间比Rails要早吧?
补充:刚查了一下,还真有这回事……
3 楼 fireflyman 2010-02-09  
作者是张文钿,臺灣的.你在GR里訂閱這個就看的到了{|ihower.tw| blog }
2 楼 fireflyman 2010-02-09  
很抱歉,我只看到繁體版,英文版沒看見.而且那個作者好像就是用繁體的~Sorry
1 楼 qichunren 2010-02-09  
你用繁体,让我很不爽。

原英文版的地址你也应该贴出来。

相关推荐

    Agile Web Development with Rails, 2nd Edition

    &lt;br&gt;Agile Web Development with Rails, 2nd Edition&lt;br&gt;&lt;br&gt;有两份PDF文件,大小分别是7.39MB和6.55MB&lt;br&gt;&lt;br&gt;作者: Dave Thomas , David Heinemeier Hansson , Leon Breedt , Mike Clark , James Duncan Davidson ,...

    rails API(html)

    自制&lt;br&gt;命令:&lt;br&gt;rails doc&lt;br&gt;cd doc&lt;br&gt;rake rails:freeze:gems 或 rake rails:freeze:edge&lt;br&gt;rake doc:rails&lt;br&gt;在rails_app/doc/doc/目录中就生成了一个API目录,即可

    unite-flask:Flask的unite.vim插件

    nnoremap &lt;silent&gt; [unite]a :&lt;C&gt;Unite -buffer-name=files flask/&lt;CR&gt; nnoremap &lt;silent&gt; [unite]v :&lt;C&gt;Unite -buffer-name=files flask/views&lt;CR&gt; nnoremap &lt;silent&gt; [unite]vt :&lt;C&gt;Unite -buffer-name=files ...

    rails连接oracle需要的驱动

    rails连接oracle需要的驱动&lt;br&gt;执行命令:C:\&gt; ruby 文件名.rb&lt;br&gt;&lt;br&gt;

    web敏捷开发rails笔记

    &lt;% 3.times do %&gt; ho!&lt;br/&gt; &lt;% end %&gt; ``` **安全输出**: - 使用`h()`方法来转义输出内容,防止XSS攻击: ```html Email: &lt;%= h("Ann&Bill&lt;frazers@isp.email&gt;") %&gt; ``` #### 四、敏捷开发与迭代 **敏捷...

    Pro ActiveRecord Databases

    Apress Pro ActiveRecord Databases with Ruby and Rails&lt;br&gt;&lt;br&gt;Active Record has primarily been covered as a subsection,&lt;br&gt;or maybe as a chapter or two, within a larger scoped book generally about the ...

    Rails表单构建器formtastic.zip

    formtastic 是一个Rails表单构建器插件,提供语义丰富和可访问的标记。 示例代码: &lt;%= semantic_form_for @post do |f| %&gt; &lt;%= f.inputs do %&gt; &lt;%= f.input :title %&gt; &lt;%= f.input :body %&gt; &lt;%= f.input :...

    RubyonRails九日学习计划

    主要功能点是: &lt;br&gt;1. 新闻发布(标题、内容(1000个汉字即可)、新闻分类、有效期)&lt;br&gt;2. 新闻的分类&lt;br&gt;3. 新闻列表显示(能翻页)&lt;br&gt;4. 新闻的详细内容显示 实践和个人能力的展示。&lt;br&gt;不拘一格尽量让学生自己...

    Api-MotoGp:在 Ruby on Rails 中开发的 Api MotoGp 信息

    自述 &lt;h1&gt;MotoGP API 参考&lt;/h1&gt; 数据分为以下类型 &lt;li&gt;Pilots &lt;li&gt;Teams &lt;li&gt;Gp Races &lt;h4&gt;Pilots &lt;/h4&gt; 这种类型的日期,返回 MotoGp 中飞行员的统计数据。 返回以下数据: &lt;li&gt;Id:每个飞行员的 BD 中的 id。 &lt;li&gt;...

    rails_多文件上传

    "&gt;添加文件:&lt;/td&gt; &lt;td&gt;&lt;a href="javascript:void(0);" class="files" id="idFile"&gt;&lt;/a&gt; &lt;img id="idProcess" style="display:none;" src="img/loading.gif" /&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="2"&gt;&lt;table border=...

    <<Ruby for Rails中文版>>源代码

    《Ruby for Rails中文版》是一本深入探讨Ruby on Rails框架的书籍,它的源代码提供了丰富的实践示例,帮助读者更好地理解和应用Rails开发技巧。在这个压缩包中,包含了多个与Rails编程相关的文件,如`r4rmusic-1`、`...

    Ruby中文论坛

    要想了解和掌握Ruby和Rails,请去这里:&lt;br&gt;&lt;br&gt;http://ruby-lang.org.cn/forums/?fromuid=172

    Ruby for Rails

    Ruby for Rails 英文原版, pdf格式&lt;br&gt;&lt;br&gt;本书是一部专门为Rails实践而写的经典Ruby著作,由四部分组成,共17章。第一部分讲述Ruby和Rails的编程环境。第二部分和第三部分与 Rails紧密联系,着重对Ruby这门语言...

    mongoid_rails_migrations:Mongoid的数据迁移

    $ rails generate mongoid:migration &lt;your&gt; 运行迁移: $ rails db:migrate $ rails db:migrate:down VERSION= $ rails db:migrate:up VERSION= $ rails db:rollback $ rails db:rollback_to VERSION= $ rails db:...

    Ruby-premailerrails轻松为邮件添加CSS样式

    `premailer-rails`会自动将`&lt;style&gt;`块中的CSS转换为内联样式,使得`.highlight`类的样式被正确应用到邮件的`&lt;p&gt;`元素上。 ### 4. 进阶应用 除了基本的样式转换,`premailer-rails`还提供了其他高级功能,比如: ...

    rails-settings:使用Ruby on Rails管理设置

    Rails的设置 Ruby gem通过将...class User &lt; ActiveRecord xss=removed&gt; { :theme =&gt; 'blue' , :view =&gt; 'monthly' , :filter =&gt; false } s . key :calendar , :defaults =&gt; { :scope =&gt; 'company' } end end

    rails _sunspot 学习笔记

    &lt;h3&gt;Found:&lt;/h3&gt; &lt;ul&gt; &lt;% for row in @search.facet(:search_class).rows %&gt; &lt;li&gt; &lt;% if params[:class].blank? %&gt; &lt;%= row.count %&gt; &lt;%= link_to(row.value, :class =&gt; row.value) %&gt; &lt;% else %&gt; &lt;strong&gt;...

    ruby 例子 模仿rails 的 mvc

    &lt;td&gt;&lt;%= user.email %&gt;&lt;/td&gt; &lt;/tr&gt; &lt;% end %&gt; &lt;/table&gt; ``` **控制器(Controller)** 控制器是MVC的中心,它协调模型和视图之间的交互。控制器接收HTTP请求,调用模型进行数据操作,然后将结果传递给视图进行...

Global site tag (gtag.js) - Google Analytics