8

私はすべてのクラスでgaloggerを使用しています。各メッセージを次のようにクラス名とメソッド名で始めたいと思います。

Class_name::Method_name

これは私が今していることです:

class FOO

 def initialize
 end

 def bar
   msg_prefix = "#{self.class}::#{__method__}"
   ... some code ...
   @logeer = "#{msg_prefix} msg ..."
 end

 def bar2
   msg_prefix = "#{self.class}::#{__method__}"
   ... some code 2 ...
   @logeer = "#{msg_prefix} msg2 ..."
 end

end

重複を防ぐためにrailsのようにbefore_filterを使用したいのですが、使用してsinatraいますが、クラスは単純な古いruby 1.9.3クラスです

アイデア?

4

2 に答える 2

8

Module#method_addedで作成された任意のメソッドでコールバックを取得し、古いメソッドをエイリアスしてから、最初に before_filter メソッドを呼び出す新しいメソッドを定義できます。これが私の(非常に)大まかな最初のコンセプトです:

module Filter
  def before_filter name
    @@filter = name
  end

  def method_added name
    return if @filtering # Don't add filters to original_ methods
    return if @@filter == name # Don't filter filters
    return if name == :initialize

    @filtering = true

    alias_method :"original_#{name}", name
    define_method name do |*args|
      self.send @@filter, name
      self.send :"original_#{name}", *args
    end
    @filtering = false
  end
end

class FilterTest
  extend Filter
  before_filter :prepare_logs

  def baz
    puts "#{@msg_prefix} message goes here"
  end

  def prepare_logs name
    @msg_prefix = "#{self.class}::#{name}"
  end
end

ft = FilterTest.new
ft.baz

__method__のように使用create_prefixすると、元のメソッドではなくフィルター メソッドの名前が取得されるため、メソッド名を渡す必要があります。それを少しきれいにする他の解決策があるかもしれません。

于 2013-02-23T21:19:14.863 に答える