rails开发工具的一些tips

Jan 09, 2011

    在这阵子的也不是很长的Rails开发过程中,零星的记录了一些开发过程中使用工具的点滴.         

Tip 1:

    是对于Rails Console而言,每当我们输入比如Review.all时,它打印出来的总是挤成一团的数据信息.     首先它没有打出SQL语句,而SQL信息有时候对于调试还是蛮重要的. 打开的打印SQL的设置很简单,可以敲rails console之后,输入
ActiveRecord::Base.logger = Logger.new(STDOUT)
    紧随其后所有的操作都回打印出查询的SQL语句,很方便.     当然只打印SQL语句也是不够的,为了阅读容易,你可以更希望Review.all不是打印出一团的很难阅读的信息,而是以表格的方式打印出来. 我刚好有看Railscasts有接触到Hirb.     首先gem install hirb一下,然后可以创建一个~/.irbrc的文件中输入
require  'rubygems'
require 'hirb'
require 'active_record'
Hirb.enable
ActiveRecord::Base.logger = Logger.new(STDOUT)
    完成两件事,设置logger输出SQL语句,同时打开hirb在窗口中以表格显示. 当然这是全局的设置,如果在某个console中觉得不爽,可以调用Hirb.disable来关闭这个表格输出.     看起来满不错的.(如果你觉得这个屏幕太小,有记录都省略掉了,你当然可以查Hirb的文档,还有办法是进rails console前将你的窗口调大点.这样它的表格的大小也会相应变大.顺便说说iTerm的Command+Enter进入全屏的方式非常爽.)         

Tip 2:

    每次写完测试,都要跑到窗口中去看rspec spec或者rake spec ,当然你也可以装一个rspec的textmate bundle,从那里面Command+R跑当前文件的测试(ps:我用得最多的还是Rspec Book中作者提到Ctr+Shift+Down来快速地在应用代码和测试代码之间快速切换). 但是每次都有涉及到一些会影响面很大的测试时(这可能会是一个代码坏味),你所想的便是跑rspec spec,但是测试代码一多,这个时间耗费实在太大,一定程度上影响了开发的节奏.     上网搜了搜,发现了这篇文章Kickstart Rspec with Spork,就有谈到使用Spork来加快Rails开发过程中的运行测试的周期.你可以去Spork的github中找到如何配置等等. 如果这其中你碰到有问题,你可以详细的查看它的Issue列表,在这里我先列举出我遇到的一些问题. 我暂时用的是 Spork 0.8.4 + Rails 3.0.3 spork (0.8.4) Authors: Tim Harper, Donald Parish Rubyforge: http://rubyforge.org/projects/spork Homepage: http://github.com/timcharper/spork Installed at: /Users/twer/.rvm/gems/ruby-1.8.7-p302@rails3.0.3     一开始我都是按照Github的配置的来的,基本上没有什么需要个性化的地方.如果你使用过程中发现这个你修改了某个Controller层或者Model层的东西,但是测试仍然失败,而你认为它应该是成功的.那么可能解决的办法是你需要找到environments/test.rb 然后设置cache_classes为false:
config.cache_classes = false
    需要注意的是:
It’s important to disable class caching in your test environment otherwise spork will preload all your models and controllers.
    关于这个问题,可以查看Issue列表上已经解决的一个问题:gotcha for the docs: rails3 defaults environment/test.rb to preload models via cache_classes setting 而Spork的作者timcharper提到
I've decide that spork 0.9.0 will disable eager loading, regardless of this variable. I may change my mind if enough people are angry about the decision.
    但是我暂时使用0.8.4这个版本是没有任何问题的,即它并没有预加载model和controller层的类. (spork -d可以列举出所以已经预加载的类).     现在用起来还真是满爽的,要跑所有测试速度也相对原来快了满多的.爽到BIANG BIANG声之后,遭遇了另外一个问题,同事有碰到一个问题是他在routes里的增加了对应的url到action的映射后,这个测试还是跑不过,提示没有对应的route有定义.我挣扎了半天,突然想到两个星期前原来Xia姐也有问过我,但当时我也没搞清楚,只能关了Spork,重启才行.额,联系到Spork的原理,我想先看看Spork会预加载哪些类了?  运行"spork -d"  一看:     

果然有routes.rb被预加载了,所以每一次运行rspec 命令,都不会去重新加载routes.rb这个文件,哪怕你在里面做了惊天地泣鬼神的变化. 所以问题是如何手动的指定了让Spork每次都重载这个文件了? 夷,可以参考Issue列表,说不定有人也有这样的问题.一看,没有找到跟我问题一样的,但是却发现有点类似的,那便是Factory girl with bundler and spork - no reloading of classes. 那我知道我应该去spec_helper.rb中的Spork.each_run 方法(默认是空)中require我门需要的文件config/routes.rb, 所以下面便是修改之后的:

Spork.each_run do
#make sure each time running rspec , it will reload routes.rb file.mod
require File.expand_path("../../config/routes", __FILE__)
end
    启动Spork,运行rspec,改动routes.rb文件,立马就能在测试中显示出效果,赞! 所以基本上以后的开发都不会需要改动Spork了,也不会有问题跟它有联系了,因为它预加载就是下面几个文件: config/application.rb config/boot.rb config/environment.rb config/initializers/backtrace_silencers.rb config/initializers/inflections.rb config/initializers/mime_types.rb config/initializers/secret_token.rb config/initializers/session_store.rb spec/spec_helper.rb     一般来说,对于开发,基本上改动的范围无外乎route, model ,view 和 controller等,上面列举的文件不需要去改动它们.     那如果以后你发现了诡异的问题,测试应该过,却要是没有过,那就按照上面的方法来办吧.     最后,在Textmate中Ctrl+Command+Alt+V可以跳出剪贴板的所有历史记录,直接输入前几个字母就能定位,这个很实用. esc可以有一定程度的补全,也很酷   看一个这个链接: 10 TextMate bundles/plugins to boost your Ruby on Rails Code Beautifier 格式化代码满好使的,AckMate搜索很方便等等
Update @2011/02/11 : How To Get Rails 3 and RSpec 2 Running Specs Fast (From Scratch)