Ruby 对象#方法与动态响应器

Ruby 对象#方法与动态响应器,ruby,method-missing,Ruby,Method Missing,我有一个名为User的Ruby对象(特别是ActiveRecord对象)。它响应诸如find_by_id、find_by_auth_token等方法。但是,这些方法不是通过def或define_方法定义的。相反,它们是通过method\u missing处理的动态方法 我想通过以下途径获得对其中一种方法的参考,例如: 但这看起来不管用。我提出的最佳解决方案是: proc { |token| User.find_by_auth_token(token) } 使用这样的包装器方法还有其他方法吗?我

我有一个名为
User
的Ruby对象(特别是ActiveRecord对象)。它响应诸如
find_by_id
find_by_auth_token
等方法。但是,这些方法不是通过
def
define_方法定义的。相反,它们是通过
method\u missing
处理的动态方法

我想通过以下途径获得对其中一种方法的参考,例如:

但这看起来不管用。我提出的最佳解决方案是:

proc { |token| User.find_by_auth_token(token) }
使用这样的包装器方法还有其他方法吗?我真的不能使用
Object#method
作为动态方法吗?

最简单的答案是“否”-通常保证
Object#method(:foo)
将返回
method
的实例的唯一方法是在对象上定义一个名为
foo
的方法

更完整的答案是,您可以通过覆盖
Object#respond#u to_missing?
s.t,强制
Object#method(:foo)
返回
method
的实例。例如:

class User
  def respond_to_missing?(method_name, include_private = false)
    method_name.to_s.start_with?('find_by_')
  end
end

m = User.new.method(:find_by_hackish_means)
# => #<Method: User#find_by_hackish_means>
类用户
def respond_to_missing?(方法名称,include_private=false)
方法\u name.to \u.s.以?('find_by_uu')开头
结束
结束
m=User.new.method(:通过黑客手段查找)
# => #
(由您来确保实际定义了该方法):

m.call
#=>NoMethodError:for的未定义方法“通过黑客手段查找”#

这里有一篇关于这个主题的更深入的博文:+1。所以它不工作真的是Rails的错。我已经开始在这方面解决它,例如,好吧,这是有意义的。还有@Marc AndréLafortune,你回答了我的问题,我立即回答了这个问题谢谢你们两位!对于将来偶然发现这一点的人来说,Rails 4.0将不推荐使用这些dynamic finder方法。我个人会谨慎地在它们之上添加额外的功能。
class User
  def respond_to_missing?(method_name, include_private = false)
    method_name.to_s.start_with?('find_by_')
  end
end

m = User.new.method(:find_by_hackish_means)
# => #<Method: User#find_by_hackish_means>
m.call
# => NoMethodError: undefined method `find_by_hackish_means' for #<User:0x123>