不知道你在做什么使得它很难知道如何回答,但增加了信息在那里在网络上;)我给@ 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
输出:
之前...
#=> 12
这是什么得到了与西纳特拉办?如果过滤器没有链接到HTTP请求,那么这是关于Ruby而不是任何框架。 – iain 2013-04-20 04:49:42
是的,我不认为Rails提供这个。过滤器用于控制器请求。这听起来像是你正在做的事情可能不是最佳的。 – 2013-04-20 05:08:26
@iain - 我在Sinatra工作,所以如果有Sinatra做这件事的方法,那么它会很有用。 – 2013-04-21 22:36:54