从初始化条件中中断方法调用

时间:2014-04-18 14:39:36

标签: ruby-on-rails ruby

以这种方式调用实例方法时......

Foo.new(n).bar

如果bar符合n方法中的特定条件,是否可以阻止initialize被解雇?

示例:

class Foo

  def initialize(n)
    if n == SOMETHING
      # Break and prevent 'bar' from firing
    end
  end

  def bar
    # Do something
  end

end

编辑:使用案例:我在课堂上有大约10种方法。我需要在任何方法触发之前检查相同的条件。我宁愿不用条件检查逻辑来混淆实例方法。

EDIT 2 该类实际上是一个事件跟踪类,它将事件数据发送到我的分析。要检查的条件是IP地址和用户名,因此我不会在生产中传输自己的事件数据。方法调用将遍及整个应用程序,它们并不真正属于(混合业务逻辑),所以我试图尽可能减少占用空间。如果我每次都需要检查IP地址和用户,它会变得很难看。

1 个答案:

答案 0 :(得分:2)

使用alias_method_chain(来自activesupport)的解决方案进入我的脑海。

class Foo
  def initialize(n)
    @break_execution = n == SOMETHING
  end

  def bar
    # do something
  end

  def foo
    # do something
  end

  def baz
    # do something
  end

  %w(foo bar baz).each do |method|
    define_method "#{method}_with_break_check" do |*args, &block|
      unless @break_execution
        send("#{method}_without_break_check", *args, &block)
      end
    end
    alias_method_chain method, :break_check
  end
end