<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Allen Chan &#187; Rails</title>
	<atom:link href="http://allenchan.org/tag/rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://allenchan.org</link>
	<description>2011 - The Year of Co-Funding</description>
	<lastBuildDate>Thu, 15 Dec 2011 09:08:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
	<atom:link rel='hub' href='http://allenchan.org/?pushpress=hub'/>
		<item>
		<title>Rails3 Beta 发布: 重点导读 [转]</title>
		<link>http://allenchan.org/2010/02/rails-3-beta-release-upgrade-instruction/</link>
		<comments>http://allenchan.org/2010/02/rails-3-beta-release-upgrade-instruction/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 17:53:30 +0000</pubDate>
		<dc:creator>Allen Chan (chenillen)</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://allenchan.org/?p=265</guid>
		<description><![CDATA[感谢@ihower的文章，写得非常详细，我直接转了过来，顺便把繁体字转成简体字了。 Beginning 从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 &#8230; <a href="http://allenchan.org/2010/02/rails-3-beta-release-upgrade-instruction/">Continue reading <span class="meta-nav">&#8594;</span></a><a class="btn small pull-right" href="http://allenchan.org/2010/02/rails-3-beta-release-upgrade-instruction/">继续阅读&#8594;</a>]]></description>
			<content:encoded><![CDATA[<div id="attachment_269" class="wp-caption aligncenter" style="width: 442px"><img src="http://allenchan.org/wp-content/uploads/2010/02/Rails-3-Beta-Released.png" alt="" title="Rails 3 Beta Released" width="432" height="231" class="size-full wp-image-269" /><p class="wp-caption-text">Rails 3 Beta Released</p></div>
<p class="indent">感谢@<a href="http://twitter.com/ihower">ihower</a>的<a href="http://ihower.tw/blog/archives/3653">文章</a>，写得非常详细，我直接转了过来，顺便把繁体字转成简体字了。</p>
<span id="more-265"></span>
<strong>Beginning</strong>
<p>从Merb 和Rails 决定<a href="http://weblog.rubyonrails.org/2008/12/23/merb-gets-merged-into-rails-3">合并</a>开始，过了一年多的努力终于发布<a href="http://weblog.rubyonrails.org/2010/2/5/rails-3-0-beta-release">Beta 版</a>啦。 Rails3 最重要的人物就是总架构师<a href="http://yehudakatz.com/">Yehuda Katz</a>了，整个把Rails core翻了好几翻，彻底改头换面。 </p>
<p>Why? 我是这么想的，DHH 一开始开发Rails 的时候，Ruby 社群还不像现在这么发达，所以很多事情必须自己造(连<a href="http://prototypejs.org/">prototype</a>都是为了Rails 而造的)，为了达到非常容易设定跟快速开发的理想，得包山包海什么功能都要做，再加上有限的资源，造成了Rails core 其实绑得很紧，基本上就是一整包给你。要修改扩充它，常常就必须monkeypatch 一下。另一方面，对怎样的Ruby 程式是好程式，一开始也没有这么多人想清楚，例如Rails core 充满了alias_method_chain，这件事情现在也被认为是比较不好的写法。 </p>
<p>Rails3 的时代不同了，Ruby 社群起来了。我们有标准的<a href="http://rack.rubyforge.org/">Rack</a>介面、我们有不同的ORM甚至是NoSQL 的储存库、我们有不同JS Libary、我们有不同测试方式<a href="http://rspec.info/">RSpec</a>、我们也有许多现成不需要自己造的新函式库。 Rails3 基本上就是这么一个接近改掉重写的版本，但是以重构的方式达成了这个兼容并蓄的目标：将API 重新厘清、彻底模组化、低耦合度元件、大幅提升效能等。具体来说，有几个成果：</p>

<h3>用 Ruby 1.8.7 或 Ruby 1.9 </h3>
<p>1.9 的时代终于要来临了:) 可以复习一下我去年演讲的<a href="http://ihower.tw/blog/archives/2722">投影片</a>。 </p>

<h3>Dependencies 管理</h3>
<p>本来的config.gem 换成新的<a href="http://github.com/carlhuda/bundler">Bundler</a>来管理所有用到的函式库，使用新的Gemfiles 格式，本来的config.gem sucks问题多功能有限。现在，我们真的做到可以完全不依靠系统gems。可以参考这篇<a href="http://www.lindsaar.net/2010/2/6/bundle_me_some_rails">Bundle me some Rails</a>示范Bundle的用法</p> 

<h3>新的 Routes</h3> 
<p>由于全面导入Rack 的关系，现在的Route 其实也是一个Rack middleware，实作上就是<a href="http://github.com/josh/rack-mount">rack-mount</a>。新的Route 第一眼看到就是API 的改变了，可以参考这篇<a href="http://rizwanreza.com/2009/12/20/revamped-routes-in-rails-3">Revamped Routes in Rails 3</a>，不过这其实不是最重要的地方，最厉害的地方是，它参数:to 接的端点其实是rack端点，而main#home是MainController.action(:home) 的简写( 是的!! Rails3 中每个Controller actions 全都是一个标准的Rack app!! 超酷!!)，可以看看Yehuda 的<a href="http://yehudakatz.com/2009/12/26/the-rails-3-router-rack-it-up/">实作说明</a>。既然是Rack端点，我们就可以给它接其他Rack app，例如Sinatra，这一篇就示范了怎么接<a href="http://lindsaar.net/2010/2/7/rails_3_routing_with_rack">Rails 3 Routing with Rack</a>，真是超级简单啊。我们可以预期，会有更多有趣的<a href="http://www.rubyinside.com/21-rack-middlewares-2649.html">Rack middlewares</a>可以与Rails结合。</p> 

<p>另外，我们也可以直接在Routes 层直接办到redirect和render template，可以看看Yehuda的实作说明：<a href="http://yehudakatz.com/2009/12/20/generic-actions-in-rails-3">Generic Actions in Rails 3</a>，基本上就是简单的Rack middleware。</p> 

<h3>新的 Active Model</h3> 
<p>为了达到与不同ORM 衔接的目标，Rails3 的ActiveModel 将本来的ActiveRecord 的个别功能抽出来成为Module，例如callbacks, validations, serialization, observing, dirty tracking 等。任何Class 只要符合ActiveModel 定义的几个API，再加上include 你需要的Module，就可以与Rails3 接在一起了。请参阅ActiveModel: <a href="http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/">Make Any Ruby Object Feel Like ActiveRecord</a>。</p> 

<p>其中Validation 有新的API，请参阅<a href="http://lindsaar.net/2010/1/31/validates_rails_3_awesome_is_true">validates :rails_3, :awesome => true</a>。</p> 

<h3>ActiveRecord</h3>
<p>那ActiveRecord 本身呢? 引入了<a href="http://github.com/brynary/arel">ARel</a>这套SQL 产生工具(<a href="http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/">why Arel?</a>)，大幅采用“method chain” 的串接用法，让每个操作都变成了scope。</p>

<p>ActiveRecord 因此也有了新的API: <a href="http://m.onkey.org/2010/1/22/active-record-query-interface">Active Record Query Interface 3.0 </a></p>

<h3>ActionController</h3> 
<p>Responder 带来了respond_with，可以简化controller 的写法，用法参考<a href="http://ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with">Cleaner RESTful Controllers w/ respond_with</a>、<a href="http://ryandaigle.com/articles/2009/8/10/what-s-new-in-edge-rails-default-restful-rendering">Default RESTful Rendering</a>和<a href="http://weblog.rubyonrails.org/2009/8/31/three-reasons-love-responder">Three reasons to love ActionController::Responder</a>这几篇。这工具非常有趣，我之前甚至写了一个plugin <a href="http://github.com/ihower/respond_methods">respond_methods</a>来让Rails 2.x 支援这个功能。 </p>

<p>另外，新的Render 实作可以让你轻易扩展，这一篇<a href="http://www.engineyard.com/blog/2010/render-options-in-rails-3/">Render Options in Rails 3</a> 示范了怎么做出你自己的render :pdf。</p>

<h3>ActionView</h3>
<p>几个大的改变：</p>
<ol>
<li>采用<a href="http://www.kuwata-lab.com/erubis/">Erubis</a>实作 </li>
<li>预设XSS protection 打开，再也不用忘记加上h 逸出了。请参考<a href="http://yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/">SafeBuffers and Rails 3.0</a>有更多细节。</li>
<li>将所有JavaScript helpers 改成unobtrusive。你会发现Rails3 的public/javascripts 多了一个rails.js，这就是一个JS driver，预设是接prototype.js，要换成jQuery 非常简单，只要用jQuery 版本的<a href="http://github.com/rails/jquery-ujs/raw/master/src/rails.js">rails.js</a>就可以了。因此本来的一些Ajax Helper就被移除了，有需要的话可以在<a href="http://github.com/rails/prototype_legacy_helper">prototype_legacy_helper plugin</a>找回来。 </li>
<li>Helpers 预设输出格式是 HTML 5。</li></ol>
<p>说到HTML5，我另外推荐这份阅读材料<a href="http://diveintohtml5.org/">Dive into HTML5</a>以及HTML 5 <a href="http://html5demos.com/">Demos and Examples</a>。</p>

<h3>ActionMailer</h3>
<p>首先底层换成<a href="http://github.com/mikel/mail">Mail</a>这套工具了，可以参考这篇<a href="http://lindsaar.net/2010/1/23/mail-gem-version-2-released">介绍</a>。接着，受益于Controller的重构成果，新的ActionMailer终于和Controller 继承自同一个AbstractController，让ActionMailer的功能增加不少，也大大的DRY了。 </p>

<p>新的API 请参考<a href="http://lindsaar.net/2010/1/26/new-actionmailer-api-in-rails-3">New ActionMailer API in Rails 3.0</a></p>

<p>最后它的位置改放在app/mailers 了，放在app/models 下实在让人搞混啊。 </p>

<h3>ActiveSupport</h3>
<p>之前的ActiveSupport 有个讨厌的地方是，如果你只想要用到其中的几个功能，很不容易搞懂到底要require 哪些东西，最后只好通通载入以求保险。新的Rails3 把这件事情弄清楚了，你可以只载入你要的部分。 </p>

<h3>Rails Application object</h3>
<p>为了让一个Process 可以跑多个Rails app，Rails3 使用了一个Rails Application 物件来表示一整个Application 的所有设定，因此本来的config/environment.rb 的功能，几乎都搬到config/application.rb 了。另外，Rack 的标准config.ru 档案也被加到了根目录，因此要特别注意到你的Application 名称，这会是跟其他Application 互动时使用的名称，预设是目录的名字。 </p>

<h3>新的Rails Module</h3> 
<p>几个常数被拿掉了，RAILS_ROOT 要改用Rails.root、RAILS_ENV 要改用Rails.env、RAILS_DEFAULT_LOGGER 要改用Rails.logger 等，详细请参阅这篇<a href="http://litanyagainstfear.com/blog/2010/02/03/the-rails-module/">The Rails Module (in Rails 3)</a>。改成物件的好处是，我们就不需要做字串操作这种事情了。 </p>

<h3>新的 rails 指令</h3> 
<p>本来的script/* 指令全部拿掉了，都改成用rails。例如script/console 变成rails console (可以简写成rails c)、script/generate 变成rails generate (可以简写成rails g)、script/server 变成rails server(可以简写成rails s)。使用 rails –help 可以看到完整说明。</p>

<h3>推荐阅读</h3>
<p>Rails3 的阅读资料非常多，官方的<a href="http://guides.rails.info/3_0_release_notes.html">Rails 3.0: Release Notes</a>是必读。如果你从升级的方向切入，可以使用官方的升级<a href="http://omgbloglol.com/post/364624593/rails-upgrade-is-now-an-official-plugin">Plugin rails-upgrade is now an official plugin</a>，它可以帮助你：</p>
<ol class="indent">
	<li>检查需要升级的地方</li>
	<li>产生Gemfile</li>
	<li>产生新的routes.rb</li>
</ol>

<p>请搭配这篇<a href="http://omgbloglol.com/post/353978923/the-path-to-rails-3-approaching-the-upgrade">The Path to Rails 3: Approaching the upgrade</a>服用。不过，嗯，现在还是不要在Production环境上升级比较好，毕竟很多Plugin 还没跟上来哩(可以看看<a href="http://railsplugins.org/">Is Your Plugin Ready For Rails 3? </a>和<a href="http://wiki.rubyonrails.org/rails/version3/plugins_and_gems">Rails Wiki</a>有整理哪些Plugins OK 了)。</p> 

<p>如果是从重新开始会容易得多，可以看<a href="http://omgbloglol.com/post/371893012/the-path-to-rails-3-greenfielding-new-apps-with-the">The Path to Rails 3: Greenfielding new apps with the Rails 3 beta</a>这篇。十分建议你有空的话，现在就可以开始玩玩看了。 </p>

<p>如果想多了解Rails 的架构，有几篇文章可以看看：</p> 

<ul class="indent">
	<li><a href="http://omgbloglol.com/post/344792822/the-path-to-rails-3-introduction">The Path to Rails 3: Introduction</a> (算是最简单的一篇，可以看看) </li>

	<li><a href="http://www.engineyard.com/blog/2010/rails-3-beta-is-out-a-retrospective/">Rails 3 Beta is Out — A Retrospective</a></li>
 
	<li><a href="http://yehudakatz.com/2009/07/19/rails-3-the-great-decoupling">Rails 3: The Great Decoupling</a></li>
 
	<li><a href="http://yehudakatz.com/2009/06/11/rails-edge-architecture/">Rails Edge Architecture</a></li>
 
	<li><a href="http://www.engineyard.com/blog/2009/rails-and-merb-merge-the-anniversary-part-1-of-6/">Rails and Merb Merge: The Anniversary (Part 1 of 6)</a></li>
 
	<li><a href="http://www.engineyard.com/blog/2009/rails-and-merb-merge-performance-part-2-of-6/">Rails and Merb Merge: Performance (Part 2 of 6)</a> </li>

	<li><a href="http://www.engineyard.com/blog/2010/rails-and-merb-merge-plugin-api-part-3-of-6/">Rails and Merb Merge: Plugin API (Part 3 of 6)</a></li>
 
	<li><a href="http://www.engineyard.com/blog/2010/rails-and-merb-merge-rails-core-part-4-of-6/">Rails and Merb Merge: Rails Core (Part 4 of 6)</a> </li>
</ul>

<p>最后，如果你还想找更多，英文的懒人包有：<a href="http://www.rubyinside.com/rails-3-0-beta-links-2966.html">Rails 3.0 Beta: 36 Links and Resources To Get You Going</a>、<a href="http://mediumexposure.com/rails-3-reading-material/">Rails 3 Reading Material</a>、<a href="http://railslove.com/weblog/2010/02/02/on-the-way-to-rails-3-a-link-list/">On the way to Rails 3 – a link list</a></p>
<strong>The End</strong>
<p class="indent">Copy完成，再次感谢@<a href="http://twitter.com/ihower">ihower</a>。那么我也分享一个Rails 3 Beta的视频教程，<a href="http://railscasts.com/episodes/200-rails-3-beta-and-rvm">Rails 3 Beta and RVM</a> By Ryan@RailsCasts</p>
]]></content:encoded>
			<wfw:commentRss>http://allenchan.org/2010/02/rails-3-beta-release-upgrade-instruction/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

