2012-09-22 4 views
5

Ruby 객체 (구체적으로 ActiveRecord 객체)는 User입니다. find_by_id, find_by_auth_token 등과 같은 메소드에 응답합니다. 그러나 이들은 def 또는 define_method을 통해 정의 된 메소드가 아닙니다. 대신, 이들은 동적 메서드이며 method_missing을 통해 처리됩니다.Object # 메소드 및 동적 응답자

내가

User.method(:find_by_auth_token) 

그것은이처럼 보이지 않는 :, Object#method를 통해 예컨대 이러한 방법 중 하나에 대한 참조를 얻 싶습니다

하지만 작동합니다. 가장 좋은 해결책은 다음과 같습니다.

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

이와 같은 래퍼 방법을 사용하는 데는 다른 방법이 있습니까? 동적 메서드에 실제로 Object#method을 사용할 수 없습니까?

+2

는, 이러한 동적 파인더 방법이 레일에서 더 이상 사용되지 않습니다 4.0. 나는 개인적으로 그들 위에 추가 기능을 추가하는 것에 신중할 것입니다. https://github.com/rails/activerecord-deprecated_finders –

답변

5

가장 간단한 대답은 Object#method(:foo)Method의 인스턴스를 반환 것이 일반적에 을 보장하는 "NO"년 - 유일한 방법입니다 개체에 대한 foo라는 방법을 정의하는 것입니다.

더 많은 답변을 얻으려면 Object#method(:foo)Object#respond_to_missing? s.t.을 재정 의하여 Method의 인스턴스를 반환하도록 강제 할 수 있습니다. 주어진 :foo 일 때 true을 반환합니다. 예를 들면 :

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> 
+2

주제에 대한 자세한 블로그 게시물은 다음과 같습니다. http://robots.thoughtbot.com/post/28335346416/always-define-respond-to-missing- 언제든지 – pje

+1

+1을 오버라이드합니다. 정말 Rails의 잘못으로 작동하지 않습니다. 그런 점에서이를 해결하기 시작했습니다. https://github.com/rails/rails/pull/6169 –

+0

좋습니다. 그리고 @ Marc-AndréLafortune, 당신은이 질문에 대한 대답으로 즉시 대답했습니다. :) 당신 덕분에 둘 다! –