Web*_*ube 8 ruby before-filter sinatra ruby-1.9.3
我在所有课程中使用ga logger.我希望每个msg都以类名和方法名开头,如下所示:
Class_name::Method_name
Run Code Online (Sandbox Code Playgroud)
这就是我现在正在做的事情:
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
Run Code Online (Sandbox Code Playgroud)
我想使用像rails中的before_filter来防止重复,我正在使用,sinatra但这些类是普通的旧ruby 1.9.3类
想法?
您可以使用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
Run Code Online (Sandbox Code Playgroud)
通过使用__method__你所使用的create_prefix,你将获得过滤方法的名称,而不是原始方法,因此你必须传递方法名称.可能还有其他解决方案使它更清洁.
| 归档时间: |
|
| 查看次数: |
2537 次 |
| 最近记录: |