meantime_filter.rb
来自「ruby on rails web敏捷开发之路第二版 源代码」· RB 代码 · 共 117 行
RB
117 行
#---# Excerpted from "Agile Web Development with Rails, 2nd Ed."# We make no guarantees that this code is fit for any purpose. # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.#---#--# Copyright (c) 2006 Roman LE NEGRATE## Permission is hereby granted, free of charge, to any person obtaining a copy# of this software and associated documentation files (the "Software"), to deal# in the Software without restriction, including without limitation the rights# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell# copies of the Software, and to permit persons to whom the Software is# furnished to do so, subject to the following conditions:## The above copyright notice and this permission notice shall be included in all# copies or substantial portions of the Software.## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE# SOFTWARE.#++module ActionController module Filters # See the README file for usage informations. module MeantimeFilter def self.included(base) #:nodoc: base.extend ClassMethods base.send :include, InstanceMethods end module ClassMethods # The passed <tt>filters</tt> will be appended to the array of filters # that's run _while_ actions on this controller are performed. def append_meantime_filter(*filters) conditions = extract_conditions!(filters) add_action_conditions(filters, conditions) append_filter_to_chain('meantime', filters) end # The passed <tt>filters</tt> will be prepended to the array of filters # that's run _while_ actions on this controller are performed. def prepend_meantime_filter(*filters) conditions = extract_conditions!(filters) add_action_conditions(filters, conditions) prepend_filter_to_chain('meantime', filters) end # Short-hand for append_while_filter since that's the most common of the # two. alias :meantime_filter :append_meantime_filter # Returns all the while filters for this class and all its ancestors. def meantime_filters #:nodoc: @meantime_filters ||= read_inheritable_attribute('meantime_filters') || [] end end module InstanceMethods def self.included(base) #:nodoc: base.module_eval do alias :perform_action :perform_action_with_filters end end def perform_action_with_filters before_action_result = before_action unless before_action_result == false || performed? during_action { perform_action_without_filters } after_action end @before_filter_chain_aborted = (before_action_result == false) end private def during_action(&action) filters_and_action = self.class.meantime_filters.reject {|filter| action_exempted?(filter) } << action call_meantime_filters_or_action(filters_and_action) end def call_meantime_filters_or_action(filters_and_action) filter = filters_and_action.shift # Case 1: it is the action if filters_and_action.empty? filter.call # Case 2: it is a filter else todo = lambda { call_meantime_filters_or_action(filters_and_action) } case when filter.is_a?(Symbol) then self.method(filter).call(&todo) when filter.is_a?(Method) then filter.call(self, &todo) when filter_class?(filter) then filter.filter(self, &todo) else raise( ActionControllerError, 'Meantime filters need to be either a symbol, a method, or any type of object implementing a static filter method which receives the controller as only parameter' ) end end end end # InstanceMethods end # MeantimeFilter end # Filtersend # ActionController
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?