5

という名前の Ruby オブジェクト (具体的には ActiveRecord オブジェクト) がありUserます。find_by_id、 などのメソッドに応答しますfind_by_auth_token。ただし、これらはdefまたはを介し​​て定義されるメソッドではありませんdefine_method。代わりに、これらは を介し​​て処理される動的メソッドですmethod_missing

Object#methodこれらのメソッドのいずれかへの参照を、たとえば次のように取得したいと思います。

User.method(:find_by_auth_token)

しかし、これはうまくいかないようです。私が思いついた最善の解決策は次のとおりです。

proc { |token| User.find_by_auth_token(token) }

このようなラッパーメソッドを使用する他の方法はありますか? Object#method動的メソッドには本当に使えないのでしょうか?

4

1 に答える 1

5

最も簡単な答えは「いいえ」です。一般Object#method(:foo)が のインスタンスを返すことを保証する唯一の方法は、オブジェクトで名前がMethod付けられたメソッドを定義することです。foo

より複雑な答えは、指定されたときに返される stをオーバーライドすることObject#method(:foo)で、 のインスタンスを強制的に返すことができるということです。例えば:MethodObject#respond_to_missing?true:foo

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>
于 2012-09-22T14:59:35.903 に答える