不知道你在做什麼使得它很難知道如何回答,但增加了信息在那裏在網絡上;)我給@ 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