$0是顶级Ruby程序的变量,但是当前方法是否有一个变量呢?


从http://snippets.dzone.com/posts/show/2785:

module Kernel
private
    def this_method_name
      caller[0] =~ /`([^']*)'/ and $1
    end
end

class Foo
  def test_method
    this_method_name
  end
end

puts Foo.new.test_method    # => test_method

甚至比我的第一个答案更好,你可以使用__method__:

class Foo
  def test_method
    __method__
  end
end

这将返回一个符号—例如:test_method。要以字符串形式返回方法名,请调用__method__。to_s代替。

注意:这需要Ruby 1.8.7。


对于Ruby 1.9+,我建议使用__callee__


我得到了相同的问题检索方法名称在视图文件。我得到了答案

params[:action] # it will return method's name

如果你想获取控制器的名称

params[:controller] # it will return you controller's name

根据你的实际需要,你可以使用__method__或__callee__,它们将当前正在执行的方法的名称作为符号返回。

在ruby 1.9上,两者的行为完全相同(就文档和我的测试而言)。

在ruby 2.1和2.2中,如果调用已定义方法的别名,__callee__的行为会有所不同。两者的文档是不同的:

__method__: "当前方法定义时的名称"(即定义时的名称) __callee__:“当前方法的调用名称”(即被调用时的名称)

测试脚本:

require 'pp'
puts RUBY_VERSION
class Foo
  def orig
    {callee: __callee__, method: __method__}
  end
  alias_method :myalias, :orig
end
pp( {call_orig: Foo.new.orig, call_alias: Foo.new.myalias} )

1.9.3输出:

1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:orig, :method=>:orig}}

2.1.2输出(__callee__返回别名,但__method__返回定义方法时的名称):

2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:myalias, :method=>:orig}}