Ruby on rails 找出在Ruby/Rails中定义方法的位置(与Java相反)

Ruby on rails 找出在Ruby/Rails中定义方法的位置(与Java相反),ruby-on-rails,ruby,Ruby On Rails,Ruby,我刚刚开始使用RubyonRails。来自Java世界,我想知道的一件事是Ruby/Rails开发人员如何找到方法的实际定义位置 我习惯于在Eclipse中单击该方法来查找即使在第三方库中定义的位置(假设我有源代码) 一个具体的例子:我试图找出Authlogic gem是如何改变我的用户类的构造函数,从而需要一个额外的参数(称为:password\u confirmation),即使用户类甚至没有继承任何与Authlogic相关的内容 可能我只是忽略了一些非常明显的事情(或者我仍然无法理解整个“

我刚刚开始使用RubyonRails。来自Java世界,我想知道的一件事是Ruby/Rails开发人员如何找到方法的实际定义位置

我习惯于在Eclipse中单击该方法来查找即使在第三方库中定义的位置(假设我有源代码)

一个具体的例子:我试图找出Authlogic gem是如何改变我的用户类的构造函数,从而需要一个额外的参数(称为:password\u confirmation),即使用户类甚至没有继承任何与Authlogic相关的内容


可能我只是忽略了一些非常明显的事情(或者我仍然无法理解整个“约定优先于配置”的事情;-)

有几种方法可以更改现有的类。例如,如果要修改字符串类写入:

class String
  def my_custom_method
    puts "hello!"
  end
end
但也有其他选择,如混合模块或使用元编程添加/修改方法

不管怎样,拥有一些对象,你总是可以:

puts obj.methods.inspect
要么在代码中执行,要么使用调试器


另一个选项是读取代码。尤其应该阅读gem的单元测试(./spec,…)。有相当多的作者指出单元测试使文档过时。

要快速找到Ruby等动态语言的方法位置有点困难

您可以使用
object.methods
object.instance\u方法
快速查找方法

如果您使用的是Ruby 1.9,则可以执行以下操作:

object.method(:method_name).source_location 

有关Ruby中source_location-

的更多信息,您还可以使用mixin将类和实例方法添加到给定的类中

基本上,如果您有一个模块,您可以使用includeextend类方法将其方法添加到给定的类中。下面是一个关于这些工作原理的简单示例

Module A
  def foo
    "foo"
  end
end

Module B
  def bar
    "bar"
  end
end

Class YourClass
  include A
  extend B
end

p YourClass.new.foo # gives "foo" because the foo method is added as instance method
p YourClass.bar     # gives "baz" because the bar method is added as class method
因为Ruby是一种动态语言,所以这些语句可以在任何地方使用。因此,对于您的问题,不需要扩展authlogic类来获取其方法。许多插件在加载时使用此指令

ActiveRecord::Base.send :include, ModuleName
通过这种方式,他们告诉每个AR对象包含一些插件定义的模块,您就可以得到AR对象中的所有方法

许多
acts\u as
插件使用的另一种技术是仅当在基类中使用
acts\u as
调用时才包含它们的模块

其他有用的参考资料

您可以使用以下内容。另请参阅它。

gem正是为这种探索性用例而设计的

Pry是一个交互式shell,它允许您使用类似shell的命令(如
cd
ls
)来浏览程序的源代码

您可以获取遇到的任何方法的文档,甚至可以查看源代码,在某些情况下包括本机C代码(使用
pry doc
插件)。您甚至可以直接跳转到文件/行,其中使用
编辑方法
命令定义了特定的方法。
show method
show doc
命令也会显示它们所操作的方法的精确位置

有关更多信息,请参阅

以下是一些例子:

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)> 

有关更多信息,请参阅:)

建议Pry gem的人都没有提到名为
查找方法的方法,这可能就是作者所寻找的方法

下面是一个例子:

pry(main)> find-method current_user

Devise::Controllers::Helpers
Devise::Controllers::Helpers#current_user
WebsocketRails::ConnectionAdapters::Base
WebsocketRails::ConnectionAdapters::Base#current_user_responds_to?

然后,您可以按照@banister的提示浏览方法代码。

谢谢,我一定会尝试pry。。。也许这会帮助我更快地适应动态编程语言=)pry网站的当前链接是谢谢,是的,我确实读到了整个mixins业务,但直到现在我才意识到它有多强大,而且它一直在所有rails代码中使用……现在“单击此处”链接被破坏了。
pry(main)> find-method current_user

Devise::Controllers::Helpers
Devise::Controllers::Helpers#current_user
WebsocketRails::ConnectionAdapters::Base
WebsocketRails::ConnectionAdapters::Base#current_user_responds_to?