在没有rails的ruby中实现rails before_filter

前端之家收集整理的这篇文章主要介绍了在没有rails的ruby中实现rails before_filter前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的所有课程中使用了一个记录器.
我希望每个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来防止两面性,
我正在使用sinatra,但课程是普通的老ruby1.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

通过使用__method__就像你在create_prefix中一样,你将获得过滤方法名称,而不是原始方法,所以你必须传递方法名称.可能还有其他解决方案可以使它更清洁.

猜你在找的Ruby相关文章