ruby-on-rails - 如何获取模型的方法名称数组?

标签 ruby-on-rails ruby

在 Rails/Ruby 中是否有可能获取模型方法的列表。 铁。模型名称.方法

我想获取属于 Mailer 模型的所有方法的名称。

最佳答案

在 ruby​​ 中排序方法总是一个问题,因为你不能简单地说:“给我那个类的特定方法”。

获取特定类的方法

您必须像@Monk_Code 提到的那样使用数组减法,即便如此,您也无法将方法与基本实现及其猴子补丁分开。

彻底删除所有包含的模块和所有父方法:

> MyClass.instance_methods - ( MyClass.ancestors - [ MyClass ] ).map( &:instance_methods ).flatten

如果您需要类方法,请将 #instance_methods 替换为 #methods

请注意,在父类中使用 #define_method 动态创建的方法(如模型回调)仍会出现,因为它们是直接在子类上定义的。

获取特定文件的方法

通常,将方法与类隔离是不够的。

我写了一个帮助程序来帮助我从文件中分离出方法。它允许这样做:

> MyModel.new.located_methods
+------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+
|                 Name                   |                                                          Location                                                          |
+------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+
| !                                      |                                                                                                                            |
| <=>                                    | /home/user/.gem/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/core.rb line 324                                       |
| unloadable                             | /home/user/.gem/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb line 245                             |
| ==                                     | /home/user/.gem/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/core.rb line 296                                       |
| validates_format_of                    | /home/user/.gem/ruby/2.0.0/gems/activemodel-4.0.0/lib/active_model/validations/format.rb line 110                           |

| and so on ... |

第一个参数允许 grep 方法名称:

> MyModel.new.located_methods /validate/
+----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
|                        Name                |                                                       Location                                                       |
+----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
| _validate_callbacks                        | /home/user/.gem/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/core_ext/class/attribute.rb line 107           |
| _validate_callbacks=                       | /home/user/.gem/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/core_ext/class/attribute.rb line 117           |
| _validate_callbacks?                       | /home/user/.gem/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/core_ext/class/attribute.rb line 114           |
| validate_associated_records_for_amenities  | /home/user/.gem/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/autosave_association.rb line 147                 |

第二个允许对每个源文件进行 grep :

> MyModel.new.located_methods /validate/, /autosave/
+----------------------------------------------------------+------------------------------------------------------------------------------------------------------+
|                        Name                |                                               Location                                               |
+----------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| validate_associated_records_for_amenities  | /home/user/.gem/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/autosave_association.rb line 147 |

代码

class Object
  # Display an object methods list with their source location.
  #
  # List can optionally be filtered by method pattern and source file
  # pattern.
  #
  # Mainly useful for debugging.
  #
  # @param [Regexp] method_pattern grep method name
  # @param [Regexp] file_pattern grep file name
  def located_methods( method_pattern = nil, file_pattern = nil )
    list = ( method_pattern ? methods.grep( method_pattern ) : methods ).sort.map do |name|
      location = method( name ).source_location
      location = "#{location.first} line #{location.second}" if location
      [ name.to_s.colorize( :yellow ), location ]
    end

    list = list.select { |meth| meth[1] =~ file_pattern } if file_pattern

    puts ( [[ 'Name'.colorize( :yellow ), 'Location' ]] + list ).to_table( first_row_is_head: true )
    true
  end
end

这个版本依赖colorizetext-table , 但您可以轻松修改它以使用您喜欢的格式设置方式。

关于ruby-on-rails - 如何获取模型的方法名称数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19977432/

相关文章:

ruby - 将 ansible 与 rvm 和 rvmrc 结合使用

ruby-on-rails - Rails 4 嵌套路由

ruby-on-rails - 单元测试 OpenID 服务器

ruby-on-rails - 使用 Ruby on Rails 批量更新

ruby-on-rails - Carrierwave如何获取文件扩展名

html - 替换 "hover"上的动态背景 - Ruby on Rails

ruby-on-rails - 使用来自另一个 Controller 的部分问题

ruby-on-rails - 没有将 Symbol 隐式转换为 String,Paperclip + Rails 4

ruby - URI Extract 在冒号处转义,有什么办法可以避免这种情况?

ruby - 在 rdoc 中显示继承的方法