私はレールに不慣れで、私が取り組んでいるプロジェクトのコードを理解するのにかなり迷っています:
で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)
対応しますか?)