安装 gem install tzinfo builder memcache-client rack rack-test rack-mount erubis mail text-format thor bundler i18n gem install rails –pre 这里会遇到一个rack-mount依赖问题,可以通过手动安装0.4.0版的rack-mount解决: sudo gem install rack-mount -v=0.4.0 升级应用 rails_upgrade(http://github.com/rails/rails_upgrade)是Rails官方的Rails3升级辅助插件,它提供了几个Rake任务帮助你轻松完成升级。 1. 执行 rails:upgrade:backup 备份会被Rails 3覆盖的文件,比如:application_controller.rb会被重命名为application_controller.rb.rails2 2. 执行 rake rails:upgrade:routes 生成Rails 3格式的routes.rb,以及rake rails:upgrade:gems生成新的Gemfile 3. 在你的程序目录执行: rails . 注意不要覆盖routes.rb和Gemfile 接下来要做的就是将备份的rails2文件合并到新生成的文件中,再次启动应用,如果幸运的话,你的应用现在已经运行在Rails 3 beta上了,注意检查Log中的Deprecated Warning,并将其替换为Rails 3的方式,关于Rails 3的新特性请参看Release Notes:http://guides.rails.info/3_0_release_notes.html ActionView Rails 3重写了View Helper,并作废了以前的link_to_function, [...]
Category Archives: 指南
Rails 2.2 国际化(i18n) 简明指南
Rails 2.2出来有段时间了,前段时间需要个Wiki程序,于是试着将Instiki(Ruby on Rails官方网站的Wiki程序)移植到了2.2(http://github.com/yzhang/instiki_i18n/tree/master),同时加上了i18n支持,需要建Wiki的朋友可以试试,不过中间发现网上的指南都讲的不太全,所以我决定把看过的几个帖子整理下,合并出一个稍微完整的指南。 基本用法 基本用法想必大家都知道了,Rails默认的Locale文件夹在config/locales下,假设你要支持中文和英语,那么你需要在这个文件夹下放置en.yml和zh.yml。 # zh.yml zh: submit: ‘提交’ create: ‘创建’ #en.yml en: submit: ‘Submit’ create: ‘Create’ Rails 会自动加载config/locales目录下的locale文件,如果你的locale文件放在别的地方,那么你可以通过修改I18n.load_path来加载它: # in config/initializer/locale.rb I18n.load_path += Dir[ File.join(RAILS_ROOT, 'lib', 'locale', '*.{rb,yml}') ] 使用很简单,你可以进入Console进行测试: > I18n.t ‘submit’ => “Submit” > I18n.locale = ‘zh’ => “zh” > I18n.t(‘submit’) => “提交” 试图中更加简单,你可以直接调用t方法: <%= t ‘submit’ %> 传递变量 有些时候,我们的字符串中可能需要包含变量,只需要将其放在两个大括号内就可以了: [...]
Rails 2.1 时区简介
今年的儿童节不止属于孩子们,它也属于所有Rails的开发者,因为DHH给大家送上了最好的儿童节礼物:Rails 2.1。因为最近正在做一个需要时区支持的项目,2.1的时区功能绝对是雪中送炭,下面让我们看看如何使用2.1中的时区功能: 先升级到2.1,然后建一个新应用 $ sudo gem update rails $ rails demo210 $ cd demo210 然后建一个post model: $ script/generate model post title:string body:text published_at:datetime $ rake db:migrate 现在我本机的时间是:2008-06-03 15:55:00,然后让我们进入Console,创建一个新的Post: >> post = Post.create(:published_at => Time.now) >> post.published_at => Tue, 03 Jun 2008 07:55:00 UTC +00:00 变成了7:55,没错,因为我本地的时区设置是UTC,而我们比UTC快了8小时,现在让我们将时区修改到上海,然后再来看看published_at: >> Time.zone.name => “UTC” >> Time.zone = ‘Asia/Shanghai’ => “Asia/Shanghai” [...]
RSpec Story简介
Story是RSpec的新功能,目前还处于试验阶段,在讲解RSpec Story之前,先让我们来看看什么是Story? 什么是Story? Story是BDD中的概念,我们可以简单的将它看作是对应用特性的描述(feature),举个例子,比如我们现在要设计一个提款机的程序,那么以下两个story是必不可少的: 用户能够取出钱来 银行职员可以放钱进去 如何定义Story? 但是我们该如何描述一个Story呢?BDD对Story的结构进行了规范,下面给出Story的定义模板,这也是RSpec支持的格式: Title (one line describing the story) Narrative: As a [role] I want [feature] So that [benefit] Acceptance Criteria: (presented as Scenarios) Scenario 1: Title Given [context] And [some more context]… When [event] Then [outcome] And [another outcome]… Scenario 2: … 我们可以看到,一个Story由2个部分组成:定义及场景,Story的定义包含3个部分:role(角色),feature(特性)以及benefit(结果),为了对结果进行度量,Story包含了许多的Scenario(场景),每个Scenario包含上下文,时间以及输出,有些抽象?让我们来看个例子,还以上面的取款机程序为例子,那么”用户能够取出钱来”的Story就可以这样定义: Story: 允许用户取钱 作为一个用户 我想要从ATM取款 这样当银行下班之后我也可以得到现金 Scenario: [...]
ActiveResource指南
尽管ActiveResource(以下简称ARes)在Rails2.0庞大的ChangeLog中只占了短短的几行,但我们不应该因此就认为这只是一个小改动,实际上,ARes可以算作是Rails1.2中引入的Resource概念的一个后续,利用Resource,你可以轻松构建基于REST风格的Web Service,而ARes则让你可以像使用ActiveRecord对象那样简单的使用这些Web Service。 理论总是过于抽象,让我们通过一个例子来看看ARes究竟是如何工作的,假设我们要开发一个类似于豆瓣那样的书评网站(我们为它申请了一个 shuping.com的域名),但为了不在一开始就让事情变得不可收拾,在第一个迭代周期内,我们只打算让用户做两件事情:提交/编辑书目,提交/编辑 /删除评论,也就是说我们只需要创建2个Resource:book和comment: map.resources :books do |book| book.resources :comments end 现在,我们已经具有了一组REST风格的URI,用户可以通过/books/new来创建新书目,或者通过/books/: book_id/comments/new来提交对书目的新评论,这对于使用浏览器的普通用户来说没什么问题,只要我们有一位足够优秀的UI设计师,用户应该不会在这一过程中感到任何的不快。但我们的目标并不局限于此,我们希望我们的数据能够被应用到更广泛的领域,同时,我们也希望用户能够通过更多的方式来向我们提交数据,而不仅仅只是通过我们自己的网站,因此,我们向第三方开发者开放了我们的REST API,他们可以通过: GET /books,获取所有书目 POST /books,创建新书目 GET /books/1.xml,获取编号为1的书目 PUT /books/1.xml,修改编号为1的书目 DELETE /books/1.xml,删除编号为1的书目 但是作为应用的开发者,他们应该如何来使用我们的API呢,要使用我们的API,他们需要: 创建一条到我们服务器的HTTP连接 构造一个请求报文 发送请求报文到我们的REST URI 解析得到的响应,处理可能的错误 不过幸运的是,有了ARes,他们不需要真的这么做,现在让我们将角色切换到为我们的书评网站开发应用的第三方开发者,假设我们要使用书评网的数据,那么,我们首先需要定义一个ARes类: class Book < ActiveResource::Base self.site = “http://shuping” end 接下来,我们就可以像ActiveRecord那样来使用我们的ActiveResource类了。 获取书目信息 要从书评网获取书目信息,可以使用find方法: books = Book.find(:all) 现在,我们已经得到了书评网最新的书目信息,那么ARes是如何帮助我们做到这些的呢?实际上它替我们向书评网发送了一条GET请求: GET http://shuping.com/books.xml <books type=”array”> <book> <title>Agile Web [...]
REST on Rails之自定义路由
要扩展你的REST路由,可以通过设置map.resource的:collection,:member或者:new选项来实现: map.resources :projects, :collection => {:rss => ‘get’} map.resources :projects, :member => {:close => ‘post’} map.resources :projects, :new => {:validate => ‘post’} :collection 扩展针对资源集合(collection)的路由,它指向一个形如 #{action} => #{method}的Hash,其中method可以是get/post/put/delete,而action就是你要扩展的方法,产生的路由为 /projects/rss(Edge Rails,Rails1.2.3为/projects;rss),因此GET /projects/rss将被影射到ProjectsController#rss,同时还有一个URL Helper:rss_projects_path。 :member同:collection类似,不过它扩展针对单个资源的路由,因此它产生的路由为/projects/1/close(Edge Rails,Rails1.2.3为/projects/1;close),它也有一个URL Helper:close_project_path。 :new也差不多,不过它针对的是那些已创建但尚未被保存的资源。 参考: Rails API文档 RESTful Rails Development PDF
REST on Rails之资源嵌套
REST认为一切都是资源(Resource),但并不是所有资源都是平行对等的,资源之间也有从属关系,要建立这种资源的层次关系,就必须将资源进行嵌套(nested resource)。 以Blog系统为例,假设每个用户拥有一个Profile,以及多个Blog,那么我们可以这样建立资源的嵌套关系,修改route.rb:
swfchart: 我的第一个插件
简介 Swfchart能够让你很轻松的将maani.us的SWF/XML Chart绘图工具集成到你的Rails应用中。 安装 首先你需要去maani.us下载SWF/XML Chart,目前经过测试的版本是4.6版,然后将其解压缩到你的public目录下: public |– charts.swf `– charts_library |– arno.swf |– arst.swf |……….. `– scno.swf 然后安装swfchart generator: $ cd $RAILS_ROOT/vendor/plugins $ svn co https://svn.elctech.com/svn/public/plugins/swfchart swfchart 使用 1. 生成文件 $ ./script/generate swfchart create lib/swfchart_helper.rb create app/controllers/swfcharts_controller.rb create app/models/swfchart.rb create test/unit/swfchart_test.rb create test/functional/swfcharts_controller_test.rb 2. 添加路由,你需要在route.rb中为swfchart添加一条路由: map.swfcharts ‘swfcharts/:name’, :controller => ‘swfcharts’, :action => ‘show’ 3. [...]
创建你自己的Generator
今天写了个简单的generator,发现比想像的要简单许多,参照的这篇贴,顺便翻译下。 以basic_auth为例,首先创建如下目录结构: basic_auth |– USAGE |– basic_auth_generator.rb `– templates |– INSTALL |– controllers | `– user_controller.rb |– lib | `– basic_auth.rb |– migrate | `– create_users.rb |– models | |– notifications.rb | `– user.rb |– test | |– fixtures | | `– users.yml | |– functional | | `– user_controller_test.rb | `– unit | `– user_test.rb `– views |– notifications | `– forgot_password.rhtml `– user |– change_password.rhtml |– forgot_password.rhtml [...]
使用ruby-prof获取rails应用的profile
ruby-prof最新的0.5版本开始支持Rails,但是文档并没有相应更新,这是来在Charlie Savage的一篇关于如何在Rails中使用ruby-prof的指南,希望对你有所帮助。 假设你发现你的Rails应用对某个请求的处理花费了太多的时间,并且你已经排除了网络,Web Server,客户端浏览器或者是数据库的嫌疑,那么ruby-prof可以帮你轻松定位出到底是那段代码消耗了太多的时间: gem install ruby-prof windows平台用户应该选择针对win32平台的预编译版本,安装完之后,你需要从ruby-prof的安装目录下拷贝plugin到你的Rails应用的vendor/plugins目录: cd /your/ruby/gems/path/ruby-prof-0.5.0/lib/ cp ruby-prof/rails_plugin/ruby_prof rails_app/vendor/plugins 然后在你的environment.rb中增加: config.cache_classes = true 如果不设置这一项的话,那么Rails会在处理每个请求时重新将所有的model和controller都加载一遍,这会消耗大量的时间,从而使你的action的花费看起来微不足道。 完成以上操作以后,如果现在你通过浏览器向Rails发送一个请求,那么在请求处理完成后,这个请求的profile已经被写入到了Log里面,它看起来是这个样子: Completed in 0.71900 (1 reqs/sec) Rendering: 0.37600 (52%) | DB: 0.18700 (26%) 200 OK [http://localhost/] Thread ID: 175635930 Total: 0.719 %self total self wait child calls name 26.15 0.19 0.19 0.00 0.00 23 PGconn#exec 26.01 0.19 [...]
