ActiveSupport ::关注和alias_method_chain

大卫

这是我的一个小问题。请注意,这是一个简化的示例。假设我有一个包含多个实例方法的类,并且我想使用来记录其中一个实例方法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

我知道我可以解决这种放置include LogStartEngine方法,start_engine但是我想保留此语句在原处。

因此约束是:

  • 仅记录方法start_engine,而不记录所有方法。
  • Car只需要包括LogStartEngine关注。我希望避免调用由顾虑添加的任何自定义帮助程序方法,例如log_method :start_engine
  • 我想保留include LogStartEngine声明的位置。我不希望它位于方法下方start_engine或课程结束时。
  • 这是使用Ruby 1.9。所以Module#prepend这不是一个有效的解决方案:)
铃木聪

这是个老问题,但我找到了答案,然后为某人写信。

module LogStartEngine
  extend ActiveSupport::Concern

  define_method :start_engine_with_logging do
    Rails.logger.info("Starting engine!")
    start_engine_without_logging
    Rails.logger.info("Engine started!")
  end

  included do
    alias_method_chain :start_engine, :logging
  end
end

define_method这是该方法的重点,它动态地在include上定义了方法(在之前alias_method_chain

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ActiveSupport ::关注缺少超级

来自分类Dev

ActiveSupport ::关注应该包括或扩展

来自分类Dev

Minitest :: Spec和ActiveSupport :: TestCase之间的区别

来自分类Dev

Ruby的Hash和ActiveSupport的HashWithIndifferentAccess之间的区别

来自分类Dev

Rails: How do I require ActiveSupport's rescue_from method?

来自分类Dev

在Rails和Sinatra之间通过memcached共享数据时,如何修复Sinatra不处理ActiveSupport

来自分类Dev

无法为具有cache_classes = true的关注项(ActiveSupport :: Concern :: MultipleIncludedBlocks)定义多个“包含”块

来自分类Dev

如何测试ActiveSupport :: TaggedLogging

来自分类Dev

Rails:如何以类似于alias_method_chain的方式来装饰属性?

来自分类Dev

Ruby 2.3安全导航运算符'&之间有什么区别。和“尝试!” ActiveSupport的方法?

来自分类Dev

与ActiveSupport的时间比较失败

来自分类Dev

cocoapods activesupport冲突ios开发

来自分类Dev

try()activesupport方法的coffeescript模拟

来自分类Dev

红宝石/哈希:ActiveSupport :: HashWithIndifferentAccess

来自分类Dev

Rails 5 生产错误 activesupport

来自分类Dev

如何在ActiveSupport :: TestCase中存根方法

来自分类Dev

ActiveSupport :: Cache :: Strategy :: LocalCache用于什么?

来自分类Dev

在ActiveSupport :: Concern模块中访问模型属性

来自分类Dev

Rspec/Rails: uninitialized constant ActiveSupport::Autoload (NameError)

来自分类Dev

ActiveSupport :: Duration错误地计算间隔?

来自分类Dev

如何用ActiveSupport :: LoggerSilence替换LoggerSilence?

来自分类Dev

莺不包括ActiveSupport区域设置文件

来自分类Dev

如何从ActiveSupport :: Duration对象中恢复整数

来自分类Dev

ActiveSupport::MessageVerifier::InvalidSignature in RegistrationsController#create

来自分类Dev

将ActiveSupport :: TimeWithZone类转换为字符串“ ActiveSupport :: TimeWithZone”

来自分类Dev

Rails5-ruby 2.2.3 // ActiveSupport :: TimeZone如何更改?

来自分类Dev

如何在ActiveSupport的XML中杀死数组标记?

来自分类Dev

我如何需要ActiveSupport的rescue_from方法?

来自分类Dev

Rails:我如何需要ActiveSupport的rescue_from方法?

Related 相关文章

  1. 1

    ActiveSupport ::关注缺少超级

  2. 2

    ActiveSupport ::关注应该包括或扩展

  3. 3

    Minitest :: Spec和ActiveSupport :: TestCase之间的区别

  4. 4

    Ruby的Hash和ActiveSupport的HashWithIndifferentAccess之间的区别

  5. 5

    Rails: How do I require ActiveSupport's rescue_from method?

  6. 6

    在Rails和Sinatra之间通过memcached共享数据时,如何修复Sinatra不处理ActiveSupport

  7. 7

    无法为具有cache_classes = true的关注项(ActiveSupport :: Concern :: MultipleIncludedBlocks)定义多个“包含”块

  8. 8

    如何测试ActiveSupport :: TaggedLogging

  9. 9

    Rails:如何以类似于alias_method_chain的方式来装饰属性?

  10. 10

    Ruby 2.3安全导航运算符'&之间有什么区别。和“尝试!” ActiveSupport的方法?

  11. 11

    与ActiveSupport的时间比较失败

  12. 12

    cocoapods activesupport冲突ios开发

  13. 13

    try()activesupport方法的coffeescript模拟

  14. 14

    红宝石/哈希:ActiveSupport :: HashWithIndifferentAccess

  15. 15

    Rails 5 生产错误 activesupport

  16. 16

    如何在ActiveSupport :: TestCase中存根方法

  17. 17

    ActiveSupport :: Cache :: Strategy :: LocalCache用于什么?

  18. 18

    在ActiveSupport :: Concern模块中访问模型属性

  19. 19

    Rspec/Rails: uninitialized constant ActiveSupport::Autoload (NameError)

  20. 20

    ActiveSupport :: Duration错误地计算间隔?

  21. 21

    如何用ActiveSupport :: LoggerSilence替换LoggerSilence?

  22. 22

    莺不包括ActiveSupport区域设置文件

  23. 23

    如何从ActiveSupport :: Duration对象中恢复整数

  24. 24

    ActiveSupport::MessageVerifier::InvalidSignature in RegistrationsController#create

  25. 25

    将ActiveSupport :: TimeWithZone类转换为字符串“ ActiveSupport :: TimeWithZone”

  26. 26

    Rails5-ruby 2.2.3 // ActiveSupport :: TimeZone如何更改?

  27. 27

    如何在ActiveSupport的XML中杀死数组标记?

  28. 28

    我如何需要ActiveSupport的rescue_from方法?

  29. 29

    Rails:我如何需要ActiveSupport的rescue_from方法?

热门标签

归档