Use before_filter rails in ruby โ€‹โ€‹without rails

I use g logger in all my classes. I want every msg to start with a class name and a method name as follows:

Class_name::Method_name 

here is what i am 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 

I want to use before_filter, as in rails, to prevent duplicity, I use sinatra , but the classes are plain old ruby 1.9.3 classes

ideas ??

+6
source share
2 answers

You can get a callback for any method created with Module # method_added , similar to the old method, and then define a new method that calls before_filter. Here is my (extremely) crude 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 

Using __method__ , as you were in create_prefix , you will get the filter method name, not the original method, so you need to pass the method name to. There may be other solutions to make this a little cleaner.

+5
source

You can use ActiveModel :: Callbacks to get before_filter behavior in simple Ruby classes (although perhaps in your case this is an overflow for just executing a single line):

 require 'active_model' class FOO extend ActiveModel::Callbacks define_model_callbacks :baz, only: :before before_baz :create_prefix def initialize end def bar run_callbacks :baz do ... some code ... @logeer = "#{@msg_prefix} msg ..." end end def bar2 run_callbacks :baz do ... some code 2 ... @logeer = "#{@msg_prefix} msg2 ..." end end private def create_prefix @msg_prefix = "#{self.class}::#{__method__}" end end 
+1
source

All Articles