あなたが何をしているのかわからないと、答え方を知るのが難しくなりますが、ウェブ上の情報を増やすために;) @fmendezの答えに代わるものを提供します:
module Filterable
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def do_before( name, &block )
before_filters[name.to_sym] = block
end
def before_filters
@before_filters ||= {}
end
def method_added( name )
return if name.to_s.start_with?("unfiltered_")
return if before_filters.has_key? name
before_filters[name.to_sym] ||= nil
alias_method "unfiltered_#{name}", name
define_method name do |*args,&block|
self.class.before_filters[name.to_sym].call if self.class.before_filters[name.to_sym]
send "unfiltered_#{name}", *args, &block
end
end
end
end
class Foo
include Filterable
def something( x )
x * 3
end
do_before :something do
puts "Before…"
end
end
Foo.new.something 4
出力:
前…<br> # => 12