在没有Rails的Ruby中实现rails before_filter [英] implement a rails before_filter in ruby without rails

查看:123
本文介绍了在没有Rails的Ruby中实现rails before_filter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在所有课程中都使用了记录器。
我希望每个msg以类名和方法名开头,如下所示:

I am using g a logger in all of my classes. I want each msg to begin with class name and method name like so:

Class_name::Method_name

这就是我现在正在做的事情:

this is what i'm doing now :

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

我想使用before_filter之类的为了防止重复,
我正在使用 sinatra ,但是这些类是普通的 ruby​​ 1.9.3 classes

i want to use a before_filter like in rails to prevent duplicity, I am using sinatra but the classes are plain old ruby 1.9.3 classes

想法?

推荐答案

您可以在使用 Modu创建的任何方法le#method_added ,将旧方法作为别名,然后定义一个新方法,该方法首先调用before_filter方法。这是我的(极端)粗略的第一个概念:

You can get a callback on any method being created with Module#method_added, alias the old method, then define a new method that calls the before_filter method first. Here's my (extremely) rough first concept:

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 中一样,您将获得过滤器方法的名称,而不是原始方法的名称,因此必须传入方法名称。可能还有其他解决方案可以使该方法更简洁。

By using __method__ like you were in create_prefix, you'll get the name of the filter method, not the original method, so you have to pass the method name in. There might be other solutions to make that a bit cleaner.

这篇关于在没有Rails的Ruby中实现rails before_filter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆