여기에 제가 가진 작은 문제가 있습니다. 이것은 단순화 된 예입니다. 의 내가 여러 인스턴스 메소드와 클래스가 있다고 가정하자 나는 ActiveSupport::Concern
사용하여 인스턴스 방법 중 하나를 기록하려면 :ActiveSupport :: Concern and alias_method_chain
module LogStartEngine
extend ActiveSupport::Concern
included do
alias_method_chain :start_engine, :logging
end
def start_engine_with_logging
Rails.logger.info("Starting engine!")
start_engine_without_logging
Rails.logger.info("Engine started!")
end
end
:
여기class Car
include LogStartEngine
def start_engine
# useful thing
end
def check_oil
# useful thing
end
def open_doors
# useful thing
end
end
내가 먼저 우려까지 온 것입니다 그러나 이것은 LogStartEngine
이 포함될 때부터
NameError: undefined method `start_engine' for class `Car'
from /Users/david/.gem/ruby/1.9.3/gems/activesupport-4.0.3/lib/active_support/core_ext/module/aliasing.rb:32:in `alias_method'
이 이해할으로 이어질 것입니다, 클래스,에는 start_engine
이라는 메서드가 없습니다.
start_engine
뒤에 include LogStartEngine
을 넣을 수는 있지만이 진술을 그대로 유지하고 싶습니다.
그래서 제약은 다음과 같습니다
- 로그 유일한 방법
start_engine
, 모든 방법. Car
단지LogStartEngine
이 필요합니다. 난 관심이 추가 된 사용자 정의 도우미 메서드를 호출하는 것을 피하기 위해, 같은 것log_method :start_engine
.include LogStartEngine
진술을 그대로 유지하고 싶습니다. 나는 그것을 방법start_engine
밑이나 수업 마지막에 있기를 원하지 않습니다.- 이것은 Ruby 1.9를 사용하고 있습니다. 그것을 달성하기 위해 다른 방법이 :
module LogStartEngine extend ActiveSupport::Concern module ClassMethods def method_added(_) unless instance_methods.include?(:start_engine_without_logging) alias_method_chain :start_engine, :logging end end end def start_engine_with_logging Rails.logger.info("Starting engine!") start_engine_without_logging Rails.logger.info("Engine started!") end end
내 하위 질문은 : 그래서
Module#prepend
내 솔루션은 여기에, 일부 시험 후 유효한 솔루션 :
그것은 훌륭하고 분명한 해결책입니다. 좋은 분! – David