写rails代码时需要知道的几个技巧

这两天我看到一篇文章,讲rails的一些使用,觉得很好,就摘到这里了,里面加了一些我自己的看法,希望原作者看到别见怪。

在 rails console 中用 _ 访问最后一个表达式

这是另一个我经常犯的错误:在 rails 控制台中查询一个 ActiveRecord model,忘了把结果保存在一个变量里,然后按↑加上一个变量再做一遍。

很幸运比我聪明的人也有这个问题,实际上他们已经解决了。每次你在 console 里面执行一个命令或者是功能,其返回值都会被保存在一个下划线的变量里(类似go语言中将不需要的返回值赋给下划线)。

所以,比如你在 console 里面执行了User.first(5)。你得到了前5个 users 但是你忘了存在一个变量里。这时你只需要.first.name或者更好的是你可以 users = . 现在变量 users 就等于User.first(5)的返回值了。

解读URL的 Controller 和 Action

这个也超有用,尤其是当你的 routes 文件达到了500行,你有5个不同的 namespaces,还有一堆自定义的 actions 时。你有个URL,你想知道它执行的是哪个 Controller 和 Action。常见的方法是打开 routes 文件然后扫描整个文件去查找。或者你会用 RailsPanel 来查看 Controller 和 Action。但这都要耗些时间。

如果你想要秒秒钟搞定这件事,在 rails console 里面用这个命令:

$ Rails.application.routes.recognize_path('http://test-isource.huawei.net/lWX314775/project1')
 => {:action=>"show", :controller=>"i5/projects", :id=>"lWX314775/project1"}

rails沙箱

你想在 console 中弄乱一些值然后看看程序怎么反应,但是你又不想破坏你的原始数据库?不用害怕,rails console 里面有一个内置的选项为此而设。用以下命令启动 rails console:

rails console --sandbox

在这个模式下 console 被包装在数据库事务中启动。当你退出回话后,事务将回滚。所以你可以随意增删改数据,当你退出 console 时数据库会被恢复到原始状态。但要小心在沙箱里面运行事务因为并非所有数据库都可以处理嵌套事务。

重新加载控制台

你在 console 里面试了一些东西,不起作用。然后你要改一下你的代码再试一次,这时候不用关掉 console 又重新启动,只需:

reload!

这种方法只针对console中的一些运算是有效的,当修改了配置文件,就不可以了。

去除ri和rdoc

当安装gem的时候,可能很长的时间都消耗在了下载文档上了,而这些文档可能你根本不会用到(我大部分时间需要看文档的时候都会去rubygems上去找)。所以可以设置在安装gem的时候不下载文档:

$ vim ~/.gemrc

添加下面的内容:

gem: --no-ri --no-rdoc
install: --no-rdoc --no-ri
update:  --no-rdoc --no-ri

我们可以通过并发安装gem让这变得更快,确保充分利用你的网络带宽处理能力。我们通过给bundler加上–jobs这个参数来完成。

$ bundle install discourse --jobs=4

查看gem源码

原文中给的方法是:

或许因为你的好奇心,你想看一下一个特定的功能是怎么执行的,想看一下你正在使用的一个gem的源代码。是的,你可以每次去google github 里面的项目然后在那里看。但是其实可以不用这样。只需要

EDITOR=subl bundle open devise

subl这里是你的编辑器,devise是你的gem名字。这里我们打开了devise这个gem。这样做的好处是它可以打开你正在使用的gem的版本。

然后你可以在项目里面做你想做的事情,你可以修改代码来理解它做了什么事,可以修改下function甚至是增加functions。当你看完了代码之后,你可以用以下命令使它回到初始状态。

$ gem pristine devise

我认为更好的方法是直接看gem包代码的地址,然后到里面去搞:

$ bundle show devise

在你的代码里面写注释

当你写代码的时候,你可能想在代码里面快速地做一些笔记。或许你可能想写下“想要重构”之类的。不用切换到其他地方去做笔记,rails提供了一个东西,你只需要在你的程序里面使用 #TODO。

#TODO make this a one line function.
def new
end

之后你可以在terminal里面输入以下命令来查看你的所有笔记: bundle exec rake notes:todo

但这样久了之后你可能会发现你有很多 todos,你可能想要描述得更加具体,你可以做一些自定义的修改,比如:

#REFACTOR make this a one line function.
def new
end

然后这样去查找: bundle exec rake notes:custom ANNOTATION=REFACTOR

找到方法的源地址

有时你在 console 中使用一个方法,尤其是你引用的 gem 包里面定义的方法,你想看看它的源代码。方法经常在不同的文件之间有相同的名称,你不确定是调用的哪个,或者说想查看这个方法在哪里定义的。这时候找到源代码的位置的最简单方法是:

user.method(:password=).source_location 
=> #["/Users/ror365/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activemodel-4.2.0/lib/active_model/secure_password.rb", 119]

返回的是确切的文件路径和相应的行号,然后你就可以按照这个去查找啦。(有人说使用ctag也不错,我不这么认为,首先ctag需要更新,其次太依赖代码跳转不利于我们理解项目)

此外原文还有清理磁盘日志和查找过时的gem的方法,我觉得比较鸡肋,就没有整理过来。
首先日志是我们经常需要看的东西,不会看日志的程序员不是好运维,所以它天然的不会太大;
其次过时gem的问题就因项目而异了,如果项目一直在紧跟Ruby、rails版本升级,可能会用到,但是现实的项目大多不会把大把的时间花在这个上面,那么gem包升级可能就也很少了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值