Получить имя текущего исполняемого метода

$0 - это переменная для программы Ruby верхнего уровня, но есть ли для текущего метода?

Ответ 1

Даже лучше, чем мой первый ответ, вы можете использовать __method __:

class Foo
  def test_method
    __method__
  end
end

Возвращает символ - например, :test_method. Чтобы вернуть имя метода в виде строки, вызовите __method__.to_s.

Примечание: Для этого требуется Ruby 1.8.7.

Ответ 2

Из 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

Ответ 3

Для Ruby 1.9+ я бы рекомендовал использовать __callee__

Ответ 4

В зависимости от того, что вы действительно хотите, вы можете использовать либо __method__, либо __callee__, которые возвращают имя исполняемого метода в настоящее время как символ.

В ruby ​​1.9 оба они ведут себя одинаково (в отношении docs и моего тестирования).

В рубине 2.1 и 2.2 __callee__ ведет себя по-другому, если вы вызываете псевдоним определенного метода (см. несколько другое описание doc)

Тест script:

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

Ответ 5

У меня возникла такая же проблема, чтобы получить имя метода в файле вида. Я получил решение

params[:action] # it will return method name

если вы хотите получить имя контроллера, затем

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