Hen*_*rik 23 ruby ruby-on-rails
我刚刚开始使用Ruby on Rails.来自Java世界,我想知道的一件事是Ruby/Rails开发人员如何找出实际定义方法的位置.
我习惯于单击Eclipse中的方法来查找即使在第三方库中定义的位置(假设我有源代码).
一个具体的例子:我试图找出Authlogic gem如何显然改变我的User类的构造函数以要求一个额外的参数(称为:password_confirmation),即使User类甚至没有继承任何与Authlogic相关的东西.
可能我只是忽略了一些非常明显的东西(或者我仍然无法围绕整个"约定配置"的东西;-))
Aru*_*nan 22
快速找到像Ruby这样的动态语言的方法位置有点困难.
您可以使用object.methods或object.instance_methods快速找到方法.
如果您使用的是Ruby 1.9,则可以执行以下操作:
object.method(:method_name).source_location
Run Code Online (Sandbox Code Playgroud)
有关source_location的更多信息 - 请单击此处
hor*_*guy 12
该撬宝石为这种探索性的用例正是设计.
Pry是一个交互式shell,它允许您使用类似shell的命令(如cd和)来浏览程序的源代码ls.
您可以为您遇到的任何方法提取文档,甚至可以查看源代码,包括某些情况下的本机C代码(使用pry-doc插件).您甚至可以直接跳转到使用该edit-method命令定义特定方法的文件/行.该show-method和show-doc命令也显示他们代理对方法的精确位置.
观看railscast截屏视频以获取更多信息.
以下是一些示例:
pry(main)> show-doc OpenStruct#initialize
From: /Users/john/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/ostruct.rb @ line 46:
Number of lines: 11
visibility: private
signature: initialize(hash=?)
Create a new OpenStruct object. The optional hash, if given, will
generate attributes and values. For example.
require 'ostruct'
hash = { "country" => "Australia", :population => 20_000_000 }
data = OpenStruct.new(hash)
p data # -> <OpenStruct country="Australia" population=20000000>
By default, the resulting OpenStruct object will have no attributes.
pry(main)>
Run Code Online (Sandbox Code Playgroud)
您还可以使用以下show-method命令查找源代码:
pry(main)> show-method OpenStruct#initialize
From: /Users/john/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/ostruct.rb @ line 46:
Number of lines: 9
def initialize(hash=nil)
@table = {}
if hash
for k,v in hash
@table[k.to_sym] = v
new_ostruct_member(k)
end
end
end
pry(main)>
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请访问http://pry.github.com :)
小智 6
没有人建议Pry gem提到所谓的方法find-method,这可能是作者所寻求的.
这是一个例子:
pry(main)> find-method current_user
Devise::Controllers::Helpers
Devise::Controllers::Helpers#current_user
WebsocketRails::ConnectionAdapters::Base
WebsocketRails::ConnectionAdapters::Base#current_user_responds_to?
Run Code Online (Sandbox Code Playgroud)
然后,您可以按照@banister的提示浏览方法代码.