0

私はレールに不慣れで、私が取り組んでいるプロジェクトのコードを理解するのにかなり迷っています:

routes.rb、私は持っています

ActionController::Routing::Routes.draw do |map|
...

  map.filter "repository_owner_namespacing", :file => "route_filters/repository_owner_namespacing"
...
end

around_recognizeでメソッドがどのように呼び出されるかを理解しようとしていrepository_owner_namespacing.rbます。後者のファイルは次のように始まります

require 'routing_filter/base'

module RoutingFilter
  class RepositoryOwnerNamespacing < Base
...
def around_recognize
...

around_recognize次のように始まる routing_filter.rb で呼び出されるようです:

module RoutingFilter
  mattr_accessor :active
  @@active = true

  class Chain < Array


    def << (filter)
      filter.successor = last
      super
    end

    def run(method, *args, &final)
      RoutingFilter.active ? last.run(method, *args, &final) : final.call
    end
  end
end

# allows to install a filter to the route set by calling: map.filter 'locale'
ActionController::Routing::RouteSet::Mapper.class_eval do
  def filter(name, options = {})
    require options.delete(:file) || "routing_filter/#{name}"
    klass = RoutingFilter.const_get name.to_s.camelize
    @set.filters << klass.new(options)
  end
end
def filters
    @filters ||= RoutingFilter::Chain.new
end

...

およびroutoing_fiter/base.rbには、

module RoutingFilter
  class Base
    attr_accessor :successor, :options

    def initialize(options)
      @options = options
      options.each{|name, value| instance_variable_set :"@#{name}", value }
    end

    def run(method, *args, &block)
      successor = @successor ? lambda { @successor.run(method, *args, &block) } : block
      send method, *args, &successor
    end
  end
end

filter.successor = last私の問題は、'last' がどこに設定されているか (in )、および @set がどこに設定されているか、本当にわからないことです。コードのプロジェクトでそれらからの包括的なトレースを見つけることができません。rubyやrailsの組み込み変数に対応していますか?(ところで、これは何に @set.filters << klass.new(options)対応しますか?)

4

1 に答える 1

1

あなたのコードでRoutingFilter::Chainは extends Array. lastメソッドはArray で定義されます。したがって、この場合、これはチェーンに追加された最後のフィルターです。

于 2013-03-05T17:08:56.970 に答える