新手问题 请问大家是怎么看 rails 代码的

zlx_star · 2012年07月26日 · 最后由 fsword 回复于 2012年07月28日 · 4140 次阅读

由于 ruby 和 rails 的动态性,给编码带来很多乐趣,但是同样导致了阅读代码的痛苦。

比如说在 views 里面有一个方法 xxx_helper 。 这个方法的定义可能:

  • 来自于应用程序正常使用 def 命令创建出来。
  • 某个 gem 或者 plugin 正常使用 def 创建出来。
  • 使用动态方法定义出来的:比如 defind_method ...

对于第一种情况下,我们一般全局搜索一下就可以。 但是对于第二第三种,要怎么去找呢?(除了凭借丰富的经验,😄

binging.pry,然后打命令 show-method xxx_helper

前面加个断点,跟进去

#1 楼 @ericguo 刚试用了一下, show-method 只能显示当前类或者模块中定义的方法?

gem 的话可以cd `bundle show gem_name`到 gem 的源码目录然后全局搜索的

匿名 #6 2012年07月27日

用 netbeans ,按住 ctrl,点你的方法名,就搞定。看源码贼方便

匿名 #7 2012年07月27日

高手就是这样来的。。。嘿嘿,找到最熟悉,最能解决效率问题的方案,你会开心并愉快。 因为你已经无所不知

@help5305fff 用 vim 的 咋整 ? 不喜欢用 netbeans

匿名 #9 2012年07月27日

@dfang 我的最高效率的方案不是 vim,所以。。。我不知道,哈哈

RubyMine 比 Netbeans 要好点个人觉得

@ericguo 谢谢推荐,好东西 不知道是否有环境变量之类的需要设置,否则pry真是神器了。 @zlx_star pry就是要找到东西

@help5305fff 可悲的是我们常常喜欢工具 A 的 A 功能,也喜欢工具 B 的 B 功能,然后就没有最了,只有同时用多个,或者找个高可定制的工具。again, VIM..

#6 楼 @help5305fff netbeans 已经抛弃 rails 了啊。

匿名 #15 2012年07月27日

@heliang7 6.9 就够了,配合 git 下的命令行,netbeans 就纯编码,外加菜鸟用来调试。 RubyMine 从 netbeans 里抄了很多了

匿名 #16 2012年07月27日

听漫步说,netbeans 下一个版本又会支持 ruby 了

#16 楼 @help5305fff 鄙视 oracle 这种投机者

#3 楼 @zlx_star pry 可以显示所有模块内的正常方法,但是那些动态生成的方法和 missing_method 幽灵方法除外,所以这个方法也不是百试百灵的……

期待牛人拿出更好方法!

对于静态生成的方法,指那些不是运行期动态生成的方法, 我使用 CTags 定位 Vim 和 SublimeText2 都可以使用 CTags

我自己写了一个脚本,来生成 CTags,如下

tags-project () 
{ 
    DIR_1=~/Documents/project/;
    DIR_2=~/.rvm/gems/ruby-1.9.3-p0@project/gems;
    DIR_3=~/.rvm/gems/ruby-1.9.3-p0@project/bundler/gems;
    DIR_4=~/.rvm/rubies/ruby-1.9.3-p0;
    cd ~/Documents/project/;
    ctags -R $DIR_1 $DIR_2 $DIR_3 $DIR_4 2> /tmp/log;
    rm .tags;
    ln -s tags .tags;
    ls --color=auto -lF tags -h
}

至于动态产生的方法,就很折磨人, 使用 binding.pry 然后使用 show-method, 只能定位到相关的创建代码, 无法直观的看到函数源码, 只能凭感觉,猜测函数代码的内容。 这点,绝对是 Ruby 的硬伤!

不过,我曾经研究过,如何查看动态生成的函数的源码的问题, 我当时发现了一个 gem 叫做 ParseTree 但是 ParseTree,不支持 ruby 1.9 后来,我就没再研究, 有关内容,可以看看这帖子 《关于查看 Rails 动态生成的函数源码的问题》 http://ruby-china.org/topics/1441

#19 楼 @ery ctags 的确挺方便,但是有个问题是默认的<C-]>会定位到第一个匹配方法,而这很多时候不准确。考虑到 ruby 这种动态语言,非运行时基本不能说精确定位。 所以有没有插件可以列出所有匹配的结果,方便手动筛选呢?

#21 楼 @zlx_star 你应该用的是 VIM 吧,我不是 vim 高手, 在 vim 的 help tag 文档里面找了半天,没找到,相关内容, 你还是问问坛子里面,vim 的高手吧。 因为我不会 vim,所以我更喜欢用 sublime text 2,够简单。

对了, :tn 可以跳到下一条匹配项, :tp 可以跳到上一条匹配项, 更多内容可以查看 :help tag

找 bug 的时候常用 tracer,这东西查源码也可以。

匿名 #24 2012年07月28日

@fsword 感觉你就属于,抵制日货那类人~好歹是做产品的,从产品自身去看问题吧。。。。好的产品,能提升自己就足够啦。自身强了,你再去打倒 oracle 呗。 比喻不当,莫怪

#22 楼 @ery 谢谢,:tn 够用了

#23 楼 @hooopo tracer 是和 pry 一样的东西吗?

#26 楼 @zlx_star 不是,举个简单的例子,我想知道 User.first 这个方法在哪里定义的:

script/rails runner "require 'tracer';Tracer.on{User.first}" > log/tracer.log
#0:/home/hooopo/.rvm/gems/ruby-1.9.3-p0@rubyist/gems/activerecord-3.2.6/lib/active_record/querying.rb:5:ActiveRecord::Querying:-:     delegate :find, :first, :first!, :last, :last!, :all, :exists?, :any?, :many?, :to => :scoped
#0:/home/hooopo/.rvm/gems/ruby-1.9.3-p0@rubyist/gems/activerecord-3.2.6/lib/active_record/scoping/named.rb:30:ActiveRecord::Scoping::Named::ClassMethods:>:         def scoped(options = nil)
#0:/home/hooopo/.rvm/gems/ruby-1.9.3-p0@rubyist/gems/activerecord-3.2.6/lib/active_record/scoping/named.rb:31:ActiveRecord::Scoping::Named::ClassMethods:-:           if options
#0:/home/hooopo/.rvm/gems/ruby-1.9.3-p0@rubyist/gems/activerecord-3.2.6/lib/active_record/scoping/named.rb:34:ActiveRecord::Scoping::Named::ClassMethods:-:             if current_scope
#0:/home/hooopo/.rvm/gems/ruby-1.9.3-p0@rubyist/gems/activerecord-3.2.6/lib/active_record/scoping.rb:125:ActiveRecord::Scoping::ClassMethods:>:       def current_scope #:nodoc:
#0:/home/hooopo/.rvm/gems/ruby-1.9.3-p0@rubyist/gems/activerecord-3.2.6/lib/active_record/scoping.rb:126:ActiveRecord::Scoping::ClassMethods:-:         Thread.current["#{self}_current_scope"]
#0:/home/hooopo/.rvm/gems/ruby-1.9.3-p0@rubyist/gems/activerecord-3.2.6/lib/active_record/scoping.rb:127:ActiveRecord::Scoping::ClassMethods:<:       end
后面还有很多。。。

#27 楼 @hooopo 正如其名。似乎是把调用过程打印出来了。的确是终极利器啊。

总结一下自己准备使用的方法:

  1. 一般的方法可以使用 Ctags 找到。配合 Ctrl+] Ctrl+o 和 :tn 命令。
  2. 动态定义的方法(👻)可以使用 debuger 一步步追踪或者 tracer 查看调用过程

#24 楼 @help5305fff 你过度联想了,我的意思很简单,做产品不能有投机心态,因为需要坚持和积累,作为用户,我认为 oracle 回过头做 NB 上的 ruby 插件不靠谱

需要 登录 后方可回复, 如果你还没有账号请 注册新账号