别名方法链未定义方法

时间:2012-01-04 19:10:48

标签: ruby-on-rails ruby

出于某种原因,我的alias_method_chain不想工作,我不知道为什么。任何人都可以向我解释为什么以下不起作用?

[2] pry(main)> Client.respond_to? :mapping
=> true
[3] pry(main)> Client.alias_method_chain :mapping, :safety
NameError: undefined method `mapping' for class `Client'

2 个答案:

答案 0 :(得分:8)

要为某个类的对象获取别名方法链,您应该在类本身而不是其实例上调用alias_method_chain。如果你想使类链方法适用同样的规则:你应该在类的单例类上调用alias_method_chain,可以像这样获得:

klass = class << Client; self; end  # => returns singleton class for Client class

在这种情况下,Clientklass类的实例(其中Class类是其超类)。

类方法链的结果示例如下:

class Client
  def self.mapping
    puts 'mapping'
  end

  def self.mapping_with_safety
    puts 'safety'
    mapping_without_safety
  end

  class << self
    # call alias_method_chain in context of Client's singleton class
    alias_method_chain :mapping, :safety
  end
end

# alternatively you can do it outside of Client class like that 
# (class << Client; self; end).alias_method_chain :mapping, :safety

Client.mapping
# => safety
# => mapping

答案 1 :(得分:3)

为了使alias_method_chain起作用,映射函数必须是实例方法,而不是像示例中的类方法,因此Client.new.respond_to? :mapping必须为真(注意新调用)。< / p>