【发布时间】:2014-04-25 15:13:18
【问题描述】:
这是我遇到的一个小问题。请注意,这是一个简化的示例。
假设我有一个包含多个实例方法的类,我想使用 ActiveSupport::Concern 记录其中一个实例方法:
class Car
include LogStartEngine
def start_engine
# useful thing
end
def check_oil
# useful thing
end
def open_doors
# useful thing
end
end
这是我首先提出的问题:
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
但这会导致
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'
这是可以理解的,因为当包含LogStartEngine 时,类Car 没有任何称为start_engine 的方法。
我知道我可以在方法 start_engine 之后放置 include LogStartEngine 来解决这个问题,但我想保留这个语句。
所以约束是:
- 只记录方法
start_engine,而不是所有方法。 -
Car只需要包含LogStartEngine关注。我想避免调用关注点添加的任何自定义帮助方法,例如log_method :start_engine。 - 我想将
include LogStartEngine语句保留在原处。我不希望它位于方法start_engine下方或课程末尾。 - 这是使用 Ruby 1.9。所以
Module#prepend不是一个有效的解决方案:)
【问题讨论】:
标签: ruby-on-rails ruby