在没有rails的ruby中实现rails before_filter
发布时间:2020-12-16 19:06:05 所属栏目:百科 来源:网络整理
导读:我在我的所有课程中使用了一个记录器. 我希望每个msg都以类名和方法名开头,如下所示: Class_name::Method_name 这就是我现在正在做的事情: class FOO def initialize end def bar msg_prefix = "#{self.class}::#{__method__}" ... some code ... @logeer
我在我的所有课程中使用了一个记录器.
我希望每个msg都以类名和方法名开头,如下所示: 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来防止两面性, 想法? 解决方法
您可以使用
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中一样,你将获得过滤方法的名称,而不是原始方法,所以你必须传递方法名称.可能还有其他解决方案可以使它更清洁. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |