可將Controller中重复的代码抽出來,有三种方法可以定义在进入Action之前、之中或之后執行特定方法,分別是before_filter
、after_filter
和around_filter
,其中before_filter
最為常用。这三个方法可以接受Code block、一个Symbol方法名称或是一个类。
before_filter
before_filter最常用用于跨Action共用的方法,或是使用者权限验证等等:
class EventsControler < ApplicationController
before_filter :find_event, :only => :show
def show
end
protected
def find_event
@event = Event.find(params[:id])
end
end
每一个都可以搭配:only
或:except
参数。
around_filter
# app/controllers/benchmark_filter.rb
class BenchmarkFilter
def self.filter(controller)
timer = Time.now
Rails.logger.debug "---#{controller.controller_name} #{controller.action_name}"
yield # 这里让出來执行Action动作
elapsed_time = Time.now - timer
Rails.logger.debug "---#{controller.controller_name} #{controller.action_name} finished in %0.3s" % elapsed_time
end
end
# app/controller/events_controller.rb
class EventsControler < ApplicationController
around_filter BenchmarkFilter
end
Filter的順序
當有多個Filter時,Rails是由上往下依序執行的。如果需要加到第一個執行,可以使用prepend_before_filter
方法,同理也有prepend_after_filter
和prepend_around_filter
。
如果需要取消從父類別繼承過來的Filter,可以使用skip_before_filter :filter_method_name
方法,同理也有skip_after_filter
和skip_around_filter
。