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設定の読み込み部分を。