Railsで学ぶフレームワーク作り - Dispatcher編 その2 Routing::Routes

前回DispatcherだとわかったRouting::Routesのrecognizeメソッドの実装をみていきましょう。

      def recognize(request)
        params = recognize_path(request.path, extract_request_environment(request))
        request.path_parameters = params.with_indifferent_access
        "#{params[:controller].camelize}Controller".constantize
      end

request.pathはまぁ普通のフレームワークと変わらないですね。
extract_request_environmentはメソッドを取り出しているだけ。

      def extract_request_environment(request)
        { :method => request.method }
      end

その後、pathの解析結果からcontrollerのクラス名を取り出して返すのような実装ですね。

recognize_pathの実装は、以下のような感じになってます。
actionpack/lib/action_controller/routing/recognition_optimisation.rb

    class RouteSet
      def recognize_path(path, environment={})
        result = recognize_optimized(path, environment) and return result

        # Route was not recognized. Try to find out why (maybe wrong verb).
        allows = HTTP_METHODS.select { |verb| routes.find { |r| r.recognize(path, :method => verb) } } 

        if environment[:method] && !HTTP_METHODS.include?(environment[:method])
          raise NotImplemented.new(*allows)
        elsif !allows.empty?
          raise MethodNotAllowed.new(*allows)
        else
          raise RoutingError, "No route matches #{path.inspect} with #{environment.inspect}"
        end
      end 

recognize_optimizedメソッドを読もうかと思ったんですが、この周辺のコードはひどく黒魔術ですね... うーん... なんかこれは踏み込んではいけないような...

一旦、Routesの設定の読み込みあたりからにしたほうがよさそうですね。ということで、次はRoute設定の読み込み部分を。