gpt4 book ai didi

ruby - 在没有 rails 的 ruby​​ 中实现一个 rails before_filter

转载 作者:数据小太阳 更新时间:2023-10-29 06:53:50 24 4
gpt4 key购买 nike

我在所有类(class)中都使用 g a logger。我希望每个消息都以类名和方法名开头,如下所示:

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

想法??

最佳答案

您可以在使用 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

通过像在 create_prefix 中一样使用 __method__,您将获得过滤器方法的名称,而不是原始方法,因此您必须传递方法名称in。可能还有其他解决方案可以使它更干净一些。

关于ruby - 在没有 rails 的 ruby​​ 中实现一个 rails before_filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15034125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com