<?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&#039;s Blog &#124; 2010 - The Year of Social Media &#187; Ruby On Rails</title>
	<atom:link href="http://allenchan.org/topics/rubyonrails/feed/" rel="self" type="application/rss+xml" />
	<link>http://allenchan.org</link>
	<description>Make lemonade when life gives you a lemon.</description>
	<lastBuildDate>Mon, 06 Sep 2010 18:30:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<atom:link rel='hub' href='http://allenchan.org/?pushpress=hub'/>
		<item>
		<title>Revently.com 内部测试上线小札</title>
		<link>http://allenchan.org/2010/09/revently-com-private-beta-journal/</link>
		<comments>http://allenchan.org/2010/09/revently-com-private-beta-journal/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 18:17:46 +0000</pubDate>
		<dc:creator>Allen Chan (chenillen)</dc:creator>
				<category><![CDATA[Revently]]></category>
		<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://allenchan.org/?p=402</guid>
		<description><![CDATA[8月29日凌晨第一封邀请信发出的时候，Revently.com内部测试上线了。很兴奋的一夜没睡着觉，就像迎接新生儿一样。 经过一个多星期的内测，发现很多问题，都在慢慢解决，也在慢慢的生成许多的新问题，很有趣，有意思的挑战。也许目前最大的问题在于地理位置的缺乏，但是我们相信面包会有的。毕竟各种网站都是从一个空架子开始搭建起来的。 从Google Analytics的数据来看，Safari用户第一，但是因为邀请的朋友都是Mac，所以不稀奇。但是这里面仍然有不少的IE用户。 为什么会拒绝IE用户呢？因为IE拒绝了我们，即使在发布的IE9测试版里面目前也没有发现IE9支持Geolocation。虽然桌面版的Geolocation存在着不少的偏差和拒绝服务，但是Revently依然在桌面版中实现这一功能，是为了大家能使用Laptop, netbook的时候也能享用到地理位置的更新。HTML5势在必行，我们欠缺的只是地理位置数据。所以在登录后的页面我们会提示大家使用Google Chrome, Apple Safari, Firefox跟Opera等浏览器，他们都是原生支持Geolocation的。 非常感谢大家的帮助和关注，如果有任何的建议，请feedback我们。 下面的日子可能会很艰苦，但是，一切都是值得期待的。让我们共同见证Revently.com吧 ;-p 感谢 @bybyqian, @Mirabel, @coccalee, @sally, @mczhao, @beingwff, @Cathy, @afra，感谢你们的时间和测试数据，还有feedbacks，很宝贵也很有建设性。（排名不分先后，按注册时间来的~） 另外，非常感谢Revently的其他成员，@blueskin, @Rainy 感谢你们的付出！]]></description>
			<content:encoded><![CDATA[<div class="wp-caption aligncenter" style="width: 570px"><img alt="Revently.com Private Beta" src="http://blog.revently.com/wp-content/uploads/2010/08/Screen-shot-2010-08-30-at-6.12.32-PM.png" title="Revently.com Private Beta" width="560" /><p class="wp-caption-text">Revently.com Private Beta</p></div>
<p class="indent">8月29日凌晨第一封邀请信发出的时候，<a href="http://revently.com">Revently.com</a>内部测试上线了。很兴奋的一夜没睡着觉，就像迎接新生儿一样。</p>
<p class="indent">经过一个多星期的内测，发现很多问题，都在慢慢解决，也在慢慢的生成许多的新问题，很有趣，有意思的挑战。也许目前最大的问题在于地理位置的缺乏，但是我们相信面包会有的。毕竟各种网站都是从一个空架子开始搭建起来的。</p>
<span id="more-402"></span>
<p class="indent">从Google Analytics的数据来看，Safari用户第一，但是因为邀请的朋友都是Mac，所以不稀奇。但是这里面仍然有不少的IE用户。
<img src="http://allenchan.org/wp-content/uploads/2010/09/Screen-shot-2010-09-07-at-1.48.04-AM-560x154.png" alt="" title="GA Data Chart" width="560" height="154" class="aligncenter size-medium wp-image-403" />
</p>
<p class="indent">为什么会拒绝IE用户呢？因为IE拒绝了我们，即使在发布的IE9测试版里面目前也没有发现IE9支持Geolocation。虽然桌面版的Geolocation存在着不少的偏差和拒绝服务，但是Revently依然在桌面版中实现这一功能，是为了大家能使用Laptop, netbook的时候也能享用到地理位置的更新。HTML5势在必行，我们欠缺的只是地理位置数据。所以在登录后的页面我们会提示大家使用Google Chrome, Apple Safari, Firefox跟Opera等浏览器，他们都是原生支持Geolocation的。</p>
<p class="indent">非常感谢大家的帮助和关注，如果有任何的建议，请feedback我们。</p>

<p class="indent">下面的日子可能会很艰苦，但是，一切都是值得期待的。让我们共同见证Revently.com吧 ;-p</p>
<p class="indent first-update">感谢 @<a href="http://revently.com/bybyqian">bybyqian</a>, @<a href="http://revently.com/mirabelwong">Mirabel</a>, @<a href="http://revently.com/coccalee">coccalee</a>, @<a href="http://revently.com/sally">sally</a>, @<a href="http://revently.com/mczhao">mczhao</a>, @<a href="http://revently.com/beingwff">beingwff</a>, @<a href="http://revently.com/Cathy">Cathy</a>, @<a href="http://revently.com/afra">afra</a>，感谢你们的时间和测试数据，还有feedbacks，很宝贵也很有建设性。（排名不分先后，按注册时间来的~）</p>
<p class="indent second-update">另外，非常感谢Revently的其他成员，@<a href="http://revently.com/blueskin">blueskin</a>, @<a href="http://revently.com/Rainy">Rainy</a> 感谢你们的付出！</p>
]]></content:encoded>
			<wfw:commentRss>http://allenchan.org/2010/09/revently-com-private-beta-journal/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>快速搭建你的Ruby On Rails环境</title>
		<link>http://allenchan.org/2010/07/quick-and-dirty-way-to-build-your-ruby-on-rails-3-environment/</link>
		<comments>http://allenchan.org/2010/07/quick-and-dirty-way-to-build-your-ruby-on-rails-3-environment/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 14:29:00 +0000</pubDate>
		<dc:creator>Allen Chan (chenillen)</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[rails3]]></category>
		<category><![CDATA[rubyonrails]]></category>

		<guid isPermaLink="false">http://allenchan.org/?p=382</guid>
		<description><![CDATA[最近项目逼近，需要迅速搭建一个Ruby On Rails的环境，于是有了这篇Tutorial，主要以Mac平台为主。 在大部分的Unix based的操作系统都有Ruby的包，可以直接安装或者已经预装好了，这里要介绍一种比较容易管理的方法。使用RVM，Ruby Version Management，这样可以在一个系统下安装不同版本的Ruby，并且可以随时更改环境。 首先，你要确保你已经在Mac下安装了Development Tools，这样你才可以编译源码。如果没有安装，拿出你的系统安装盘，找到XCode，安装文件，直接装好就行了。 下面，我们就进入RVM的安装了。更多细节可以参考 http://rvm.beginrescueend.com/ 如果你没有git的话，就用下面的命令吧，在Terminal中输入：（检查有没有git？在Terminal输入，如果返回路径就是有git了） which git bash <]]></description>
			<content:encoded><![CDATA[<div id="attachment_387" class="wp-caption aligncenter" style="width: 570px"><img src="http://allenchan.org/wp-content/uploads/2010/07/RubyOnRails3.jpg" alt="" title="Ruby On Rails 3" width="560" height="401" class="size-full wp-image-387" /><p class="wp-caption-text">Ruby On Rails 3</p></div>
<p class="indent">最近项目逼近，需要迅速搭建一个Ruby On Rails的环境，于是有了这篇Tutorial，主要以Mac平台为主。</p>
<p class="indent">在大部分的Unix based的操作系统都有Ruby的包，可以直接安装或者已经预装好了，这里要介绍一种比较容易管理的方法。使用RVM，Ruby Version Management，这样可以在一个系统下安装不同版本的Ruby，并且可以随时更改环境。</p>
<span id="more-382"></span>
<p class="indent">首先，你要确保你已经在Mac下安装了Development Tools，这样你才可以编译源码。如果没有安装，拿出你的系统安装盘，找到XCode，安装文件，直接装好就行了。</p>
<p class="indent">下面，我们就进入RVM的安装了。更多细节可以参考 <a href="http://rvm.beginrescueend.com/" target="_blank">http://rvm.beginrescueend.com/</a>
</p><p class="indent">如果你没有git的话，就用下面的命令吧，在Terminal中输入：（检查有没有git？在Terminal输入，如果返回路径就是有git了）
<pre><code class="bash">which git</code></pre>
<pre><code class="bash">bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )</code></code></pre>
如果有git的话，用这条命令：
<pre><code class="bash">mkdir -p ~/.rvm/src/ &#038;&#038; cd ~/.rvm/src &#038;&#038; rm -rf ./rvm/ &#038;&#038; git clone --depth 1 git://github.com/wayneeseguin/rvm.git &#038;&#038; cd rvm &#038;&#038; ./install</code></pre>
安装好之后，在Terminal中输入which rvm应该会返回类似于</p>
<pre><code>/Users/xxxxxxx/.rvm/bin/rvm</code></pre>
<p class="indent">那么恭喜你，RVM已经安装完成。</p>
<p class="indent">那么下面我们来安装Ruby，目前Ruby流通的版本很多，1.8.x &#8211; 1.9.x都有，考虑到我们要使用Rails 3.0的框架，所以，1.8.7一下的版本就不需要考虑了。推荐用<a href="http://www.rubyenterpriseedition.com/" target="_blank">Ruby Enterprise Edition (ree)</a>，这个版本的Ruby是在MRI Rubies的基础上进行开发的，基于1.8.x版本的，然后也打了了GC补丁例如MBARI，在运行效率上面有显著的提高，推荐的生产环境中使用。为了和生产环境保持一致，我们在自己的开发环境也使用这个版本就行了。在Terminal中输入：</p>
<pre><code class="bash">rvm install ree</code></pre>
<p class="indent">经过一系列的编译，你将完整的得到REE </p>
<pre><code class="bash">ruby 1.8.7 (2009-12-24 patchlevel 248) [i686-darwin10.3.1], MBARI 0x6770, Ruby Enterprise Edition 2010.01</code></pre>
<p class="indent">这个时候，你系统默认的ruby还是在<pre><code class="bash">/usr/bin/ruby</code></pre>下面的，在Terminal中输入如下命令
<pre><code class="bash">rvm use ree --default
which ruby
</code></pre>
最后返回的结果是：</p>
<pre><code class="bash">/Users/xxxxxxx/.rvm/rubies/ree-1.8.7-2010.01/bin/ruby</code></pre>
<p class="indent">那么这个时候1.8.7版本的Ruby已经安装好，并且成为了你这个用户下面默认的版本，如果你要查询rvm其他的命令，你直接输入rvm就能获得帮助。</p>
<p class="indent">下一步，我们需要安装RubyGems，是一个Ruby gem的包管理软件，在 <a href="http://rubygems.org/pages/download" target="_blank">http://rubygems.org/pages/download</a> 下载最新的 1.3.7版本。解压缩后，进入目录，在Terminal中输入：
<pre><code class="bash">ruby setup.rb</code></pre>
就应该很快安装好，依然输入<pre><code class="bash">which gem</code></pre>，能够返回<pre><code class="bash">/Users/xxxxxx/.rvm/rubies/ree-1.8.7-2010.01/bin/gem</code></pre>的路径就可以了。</p>

<p class="indent">最后，我们来安装Rails 3.0。到目前为止，Rails 3.0还是在beta中，所以直接在Terminal中输入：</p>
<pre><code class="bash">gem install rails --pre</code></pre>
<p class="indent">经过一段时间，Rails 3.0 beta4就安装好了。</p>
<p class="indent">测试一下环境，在随意的目录中，输入</p>
<pre><code class="bash">rails new TestApp --database=mysql</code></pre>
<p class="indent">就能获得下面生成的文件</p>
<pre><code class="bash">
      create  
      create  README
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      create  app
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/views/layouts/application.html.erb
      create  app/models
      create  config
      create  config/routes.rb
      create  config/application.rb
      create  config/environment.rb
      create  config/environments
      create  config/environments/development.rb
      create  config/environments/production.rb
      create  config/environments/test.rb
      create  config/initializers
      create  config/initializers/backtrace_silencers.rb
      create  config/initializers/inflections.rb
      create  config/initializers/mime_types.rb
      create  config/initializers/secret_token.rb
      create  config/initializers/session_store.rb
      create  config/locales
      create  config/locales/en.yml
      create  config/boot.rb
      create  config/database.yml
      create  db
      create  db/seeds.rb
      create  doc
      create  doc/README_FOR_APP
      create  lib
      create  lib/tasks
      create  lib/tasks/.gitkeep
      create  log
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log
      create  public
      create  public/404.html
      create  public/422.html
      create  public/500.html
      create  public/favicon.ico
      create  public/index.html
      create  public/robots.txt
      create  public/images
      create  public/images/rails.png
      create  public/stylesheets
      create  public/stylesheets/.gitkeep
      create  public/javascripts
      create  public/javascripts/application.js
      create  public/javascripts/controls.js
      create  public/javascripts/dragdrop.js
      create  public/javascripts/effects.js
      create  public/javascripts/prototype.js
      create  public/javascripts/rails.js
      create  script
      create  script/rails
      create  test
      create  test/performance/browsing_test.rb
      create  test/test_helper.rb
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/unit
      create  tmp
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  tmp/pids
      create  vendor/plugins
      create  vendor/plugins/.gitkeep
</code></pre>
<p class="indent">Okay，快速的搭建Ruby On Rails环境已经好了。</p>
<p class="indent">如果你还要安装Mysql数据库，请参考另外的文章：<a href="/2009/11/installing-wordpress-locally/">安装本地WordPress测试环境</a></p>
]]></content:encoded>
			<wfw:commentRss>http://allenchan.org/2010/07/quick-and-dirty-way-to-build-your-ruby-on-rails-3-environment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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 管理 本来的config.gem 换成新的Bundler来管理所有用到的函式库，使用新的Gemfiles 格式，本来的config.gem sucks问题多功能有限。现在，我们真的做到可以完全不依靠系统gems。可以参考这篇Bundle me some Rails示范Bundle的用法 新的 Routes 由于全面导入Rack 的关系，现在的Route 其实也是一个Rack middleware，实作上就是rack-mount。新的Route 第一眼看到就是API [...]]]></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>
		<item>
		<title>重构你的Rails程序 &#8211; 读书笔记</title>
		<link>http://allenchan.org/2009/04/refactoring-your-rails-application/</link>
		<comments>http://allenchan.org/2009/04/refactoring-your-rails-application/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 18:19:52 +0000</pubDate>
		<dc:creator>Allen Chan (chenillen)</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://t.allenchan.com.cn/?p=46</guid>
		<description><![CDATA[好久没有用心读过一篇文章了，今天翻出了Railsconf 2008 Zach Dennis的Refactoring Your Rails Application，顺便记了个笔记。 首先，我了解了什么叫Code Smells异味代码 在电脑编程有一句俗话，异味的代码就是那些在源码中出现任何症状，也就是会给整个程序带来更深入问题的代码。（这些代码就是需要我们重构的） 那么有以下几种异味的代码： 重复代码 Duplicated code 如果你有相同的代码或者结构出现在两个以上的地方 散弹枪手术 Shotgun Surgery 如果你改变一个地方的代码将会影响你的程序的很多代码块的时候 太过长的方法 Long Method 太过长的方法比较难懂，也比较难维护，容易混淆他们的功能 不恰当的关系 Inappropriate Intimacy 在你的一个类里面出现了一些方法代码跟这个类毫无关系，比如说你的视图模块中出现了SQL代码，其实这些代码更适合放在你的模型类中 不同的改变 Divergent Change 类只有一个使其改变的原因，而一个对象却不遵循这个原则（单一责任原则SRP） 体积太大的类 Large Class 当一个类包括的方法过多的时候 反客为主 Feature Envy 当一个方法里面涉及到别的类比自身类的对象更多的时候 Message Chains 信息链 例如：当你获得一个对象时，又从这个对象获得了另一个对象和另一个对象的结果。这样的获取重复了这个结构。 一些简单使用代码块的重构方法 扩展你的类 Extract Class 你有一个实现的类，但是这个类却可以分解成两个或更多。重新建立新类，把相关方法放在同一个类里面 (Reference: —Refactoring, Fowler, pg. 149.) 转移你的方法 Move [...]]]></description>
			<content:encoded><![CDATA[<p class="indent">好久没有用心读过一篇文章了，今天翻出了Railsconf 2008 Zach Dennis的Refactoring Your Rails Application，顺便记了个笔记。</p>
<h3>首先，我了解了什么叫Code Smells异味代码</h3>
<p class="indent">在电脑编程有一句俗话，异味的代码就是那些在源码中出现任何症状，也就是会给整个程序带来更深入问题的代码。（这些代码就是需要我们重构的）</p>
<span id="more-46"></span>

<p class="indent">那么有以下几种异味的代码：</p>
<ul>
	<li>重复代码 Duplicated code</li>
<p class="indent">如果你有相同的代码或者结构出现在两个以上的地方</p>
	<li>散弹枪手术 Shotgun Surgery</li>
<p class="indent">如果你改变一个地方的代码将会影响你的程序的很多代码块的时候</p>
	<li>太过长的方法 Long Method</li>
<p class="indent">太过长的方法比较难懂，也比较难维护，容易混淆他们的功能</p>
	<li>不恰当的关系 Inappropriate Intimacy</li>
<p class="indent">在你的一个类里面出现了一些方法代码跟这个类毫无关系，比如说你的视图模块中出现了SQL代码，其实这些代码更适合放在你的模型类中</p>
	<li>不同的改变 Divergent Change</li>
<p class="indent">类只有一个使其改变的原因，而一个对象却不遵循这个原则（单一责任原则SRP）</p>
	<li>体积太大的类 Large Class</li>
<p class="indent">当一个类包括的方法过多的时候</p>
	<li>反客为主 Feature Envy</li>
<p class="indent">当一个方法里面涉及到别的类比自身类的对象更多的时候</p>
	<li>Message Chains 信息链</li>
<p class="indent">例如：当你获得一个对象时，又从这个对象获得了另一个对象和另一个对象的结果。这样的获取重复了这个结构。</p>
</ul>
<p class="indent">一些简单使用代码块的重构方法</p>
<ul>
	<li>扩展你的类 Extract Class</li>
<p class="indent">你有一个实现的类，但是这个类却可以分解成两个或更多。重新建立新类，把相关方法放在同一个类里面 (Reference: —Refactoring, Fowler, pg. 149.)</p>

	<li>转移你的方法 Move Method</li>
<p class="indent">当你有一个旧方法中的一段代码正在或者将会被用在多个方法或者其他类的时候，你必须要定义一个新方法，放在你的类中。而你在旧方法中申明引用这个新方法，删除那段代码 (Reference: —Refactoring, Fowler, pg. 142.)</p>

	<li>扩展你的方法 Extract Method</li>
<p class="indent">当你有一些代码片段可以放在一起用，那么就把这些代码放进一个方法，取一个好名字。
(Reference: —Refactoring, Fowler, pg. 110.)</p>
</ul>
<p class="indent">接下来就来个实战第一例：在Partial中使用本地变量代替实例变量 Replace Instance Variable With Local Variable in Partial</p>
<p class="indent">最开始的时候，有这么一段代码：</p>
<pre><code class="ruby">
# app/views/layouts/application.html.erb
< % if @project %>
< %= render :partial => “projects/sidebar” %>
< % end %>
# app/views/projects/_sidebar.html.erb
< %= h @project.name %>
< %= render :partial => “projects/users” %>
# app/views/projects/_users.html.erb
</code></pre>
<p class="indent">很显然，我们在只是一个模板调用这个partial的时候，完全没有问题，可是一旦有多个模板调用partial的时候，可能在模板内使用实例变量不是一样的了，那么这个时候，我们要将partial中的实例变量换为本地变量，然后在render的时候把实例变量传给本地变量就行了，所以代码就改为了：</p>
<pre><code class="ruby">
# app/views/projects/_users.html.erb
< % project.users.each do |user| %>
< %= user.name %>
< % end %>
# app/views/projects/_sidebar.html.erb
< %= h @project.name %>
< %= render :partial => “projects/users”, 
                      :locals => { :project => @project } %>
# app/views/layouts/application.html.erb
< % if @project %>
< %= render :partial => “projects/sidebar”, 
                      :locals => { :project => @project } %>
< % end %>
</code></pre>]]></content:encoded>
			<wfw:commentRss>http://allenchan.org/2009/04/refactoring-your-rails-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在VPS上配置LAMP服务器高级教程-Mysql篇</title>
		<link>http://allenchan.org/2008/11/configure-lamp-server-with-apache-mysql-php-centos-1/</link>
		<comments>http://allenchan.org/2008/11/configure-lamp-server-with-apache-mysql-php-centos-1/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 20:53:10 +0000</pubDate>
		<dc:creator>Allen Chan (chenillen)</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://t.allenchan.com.cn/?p=35</guid>
		<description><![CDATA[终于买了cheapvps.co.uk的VPS（虚拟私有主机）。配置是512MB (1GB Burst) / 25GB HD / 500GB BW / 1IP 今天我要讲的是不是通过VPS服务商提供的LXadmin来配置LAMP服务器，而是直接通过SSH，用Terminal来从源码安装所需要的服务。 启动好你的Server，我安装的是CentOS 5.1，OpenSSH已经在服务器上装好，所以我们可以直接链接上，默认的root密码服务商都已经发邮件通知你了。 按照我的做法，输入你的密码，就已经登录了。 首先，我们要删除CentOS自带的Apache服务，因为CentOS5已经默认给你安装了Apache2.2.3。先删除httpd.conf，用命令： rm /etc/httpd.conf 再删除httpd整个文件夹： rm -rf /usr/httpd/ 抱歉，可能httpd的正确位置不是这个，因为我的已经删除了，记忆力不太好了,:-P 基本上，原装的Apache已经不能工作了。那么我们开始了： 你要确认你的系统已经更新到最新了，并且安装好GCC和所需的库，所以运行以下代码先： yum upgrade yum -y install gcc gcc-c++ autoconf libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel [...]]]></description>
			<content:encoded><![CDATA[<p class="indent">终于买了<a href="http://cheapvps.co.uk">cheapvps.co.uk</a>的VPS（虚拟私有主机）。配置是512MB (1GB Burst) / 25GB HD / 500GB BW / 1IP</p>

<p class="indent">今天我要讲的是不是通过VPS服务商提供的LXadmin来配置LAMP服务器，而是直接通过SSH，用Terminal来从源码安装所需要的服务。</p>

<p class="indent">启动好你的Server，我安装的是CentOS 5.1，OpenSSH已经在服务器上装好，所以我们可以直接链接上，默认的root密码服务商都已经发邮件通知你了。</p>

<img src="/wp-content/uploads/2009/11/ssh.png" alt="SSH" title="SSH" width="412" height="46"  />

<p class="indent">按照我的做法，输入你的密码，就已经登录了。</p>

<p class="indent">首先，我们要删除CentOS自带的Apache服务，因为CentOS5已经默认给你安装了Apache2.2.3。先删除httpd.conf，用命令：
<pre><code class="bash">rm /etc/httpd.conf</code></pre>
再删除httpd整个文件夹：
<pre><code class="bash">rm -rf /usr/httpd/</code></pre>
<em>抱歉，可能httpd的正确位置不是这个，因为我的已经删除了，记忆力不太好了,:-P</em>
基本上，原装的Apache已经不能工作了。那么我们开始了：</p>
<span id="more-35"></span>

<p class="indent">你要确认你的系统已经更新到最新了，并且安装好GCC和所需的库，所以运行以下代码先：
<pre><code class="bash">yum upgrade</code></pre>
<pre><code class="bash">yum -y install gcc gcc-c++ autoconf  libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel</code></pre>
</p><p class="indent">在你的home目录下，建立一个src目录
<pre><code class="bash">mkdir ~/src</code></pre>
<pre><code class="bash">cd src</code></pre>
下载以下的软件和库等相关文件，因为VPS在美国，直接在服务器上下载比在本地下载还要快，而且更省事。
<pre><code class="bash">wget http://mirrors.kahuki.com/apache/httpd/httpd-2.2.10.tar.gz
wget http://www.php.net/get/php-5.2.6.tar.gz/from/this/mirror
wget http://php-fpm.anight.org/downloads/head/php-5.2.6-fpm-0.5.9.diff.gz
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.29-rc.tar.gz/from/http://mirror.x10.com/mirror/mysql/
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz
wget http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&amp;big_mirror=0
wget http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.7.tar.gz?modtime=1194463373&amp;big_mirror=0
wget http://pecl.php.net/get/memcache-2.2.4.tgz
wget http://downloads.sourceforge.net/mhash/mhash-0.9.9.tar.gz?modtime=1175740843&amp;big_mirror=0
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.8.tar.gz
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz</code></pre>
</p>
<p class="indent">好叻，开始安装吧，把每个文件解压缩，这里我就不一一示范了，解压缩tar.gz等的用的命令是<strong>tar zxf *.tar.gz</strong>，解压缩tar.bz2的命令是<strong>tar jxf *.tar.bz2</strong></p>

<p class="indent">我们第一开始安装的是mysql，因为它牵涉的前期库和其他的要求不多。安装mysql之前，我们先要给mysql创建一些用户和组，使用useradd 和groupadd来完成，依次输入以下的命令：
<pre><code class="bash">groupadd mysql
useradd -g mysql mysql</code></pre>
进入mysql的source文件夹，使用一下configure方法，如果你有别的需求，可以用./configure &#8211;help来获得帮助：
<pre><code class="bash">./configure --prefix=/usr/local/mysql --localstatedir=/database --with-ssl=/usr/lib/openssl --with-low-memory --disable-maintainer-mode --with-mysqld-user=mysql --with-unix-socket-path=/tmp/mysql.sock --without-comment --without-debug --without-bench --with-innodb</code></pre>
</p>
<p class="indent">我默认安装的位置在/usr/local/mysql/这是个人喜好，也有人喜欢把它直接装在/usr/local/下，这样的好处是不用把bin文件再做链接到系统环境里面了。并且把数据文件装在根目录下/database
然后配置好了，之后就make &amp; make install一般没有什么问题。</p>

<p class="indent">Mysql是编译最久的一个软件，它经常会在某个地方呆很久，但是别担心，如果没有报错，肯定没问题，过20分钟差不多就ok了。</p>

<p class="indent">接下来我们需要做一些工作，把mysql的系统和数据文件的权限设置好：
<pre><code class="bash">chown -R root:mysql /usr/local/mysql
chown -R mysql:mysql /database</code></pre>
这样我们就可以安装初始数据了，使用以下命令：
<pre><code class="bash">./scripts/mysql_install_db</code></pre>
安装好以后，安装会提示你把mysql的lib库放进动态库加载的列表中，所以编辑：vim /etc/ld.so.conf
在文件中加入/usr/local/mysql/lib/mysql
/usr/local/mysql/lib/mysql/plugin (如果你加入了plugin，这里我们加入了innoDB的支持)
并且运行ldconfig
拷贝config文件到指定地方
<pre><code class="bash">cp support-files/my-medium.cnf /etc/my.cnf
chown root:sys /etc/my.cnf
chmod 644 /etc/my.cnf</code></pre>
创建一个可以控制mysql服务的文件
<pre><code class="bash">cp ./support-files/mysql.server /etc/rc.d/init.d/mysql
chmod +x /etc/rc.d/init.d/mysql
/sbin/chkconfig --level 3 mysql on</code></pre>
把mysql的bin执行文件做一个快捷方式到系统的环境变量中，我这里推荐放在/usr/local/bin中
<pre><code class="bash">cd /usr/local/mysql/bin
for file in *; do ln -s /usr/local/mysql/bin/$file /usr/local/bin/$file; done</code></pre>
需要做一个让mysql自动启动的链接，并且启动mysql，使用以下命令：
<pre><code class="bash">ln -s /etc/rc.d/init.d/mysql /etc/rc.d/rc3.d/S90mysql
/etc/rc.d/init.d/mysql start</code></pre>
如果你想控制mysql服务，请使用：
<pre><code class="bash">/etc/rc.d/init.d/mysql start
/etc/rc.d/init.d/mysql stop</code></pre>
下面我们更改mysql root用户的密码：
<pre><code class="bash">mysqladmin -u root password new-password</code></pre>
更改好了之后我们就可以进入mysql了，使用：
<pre><code class="bash">mysql -u root -p</code></pre>
输入你的密码，就进入了mysql，这样mysql建立好了。</p>]]></content:encoded>
			<wfw:commentRss>http://allenchan.org/2008/11/configure-lamp-server-with-apache-mysql-php-centos-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
