美文网首页
rails路由学习2-journey

rails路由学习2-journey

作者: SecondRocker | 来源:发表于2018-05-27 15:21 被阅读26次

上文说到,由url匹配到app是由journey完成的,那么journey是怎么完成的呢?

首先回到 routes.rb里,get,post 方法最终是会调用match方法的,match方法会调用map_match -> decomposed_match -> ....无数层,最终会调用 journey的routes 的 add_route 方法,生成多个的 Journey::Route 的对象。Journey::Router

ActionDispatch::Routing::RouteSet 作为最后一层rack middleware,在call方法中调用 Journey::Router::Utils.normalize_path将url标准化以使rourney::route可以辨别

  def self.normalize_path(path)
          path ||= ""
          encoding = path.encoding
          path = "/#{path}".dup
          path.squeeze!("/".freeze)
          path.sub!(%r{/+\Z}, "".freeze)
          path.gsub!(/(%[a-f0-9]{2})/) { $1.upcase }
          path = "/".dup if path == "".freeze
          path.force_encoding(encoding)
          path
end

route在app方法中循环调用route.app 的call方法,,依次找到匹配url的app并调用,之后是Routing::RouteSet::Dispatcher.new调用相对应的controller的dispatch方法

def call env
      env['PATH_INFO'] = Utils.normalize_path env['PATH_INFO']

      find_routes(env).each do |match, parameters, route|
        script_name, path_info, set_params = env.values_at('SCRIPT_NAME',
                                                           'PATH_INFO',
                                                           @params_key)

        unless route.path.anchored
          env['SCRIPT_NAME'] = (script_name.to_s + match.to_s).chomp('/')
          env['PATH_INFO']   = match.post_match
        end

        env[@params_key] = (set_params || {}).merge parameters

        status, headers, body = route.app.call(env)

        if 'pass' == headers['X-Cascade']
          env['SCRIPT_NAME'] = script_name
          env['PATH_INFO']   = path_info
          env[@params_key]   = set_params
          next
        end

        return [status, headers, body]
      end

      return [404, {'X-Cascade' => 'pass'}, ['Not Found']]
    end

至此,完成路由

相关文章

  • rails路由学习2-journey

    上文说到,由url匹配到app是由journey完成的,那么journey是怎么完成的呢? 首先回到 routes...

  • rails项目学习

    Rails路由学习 <%= link_to 'hello', {:controller => 'welcome',...

  • rails基础汇总

    一:ruby on rails, Router路由 前言:ruby学习掌握20%就可以开始rails的学习了,知道...

  • Rails路由学习

    一般路由 events_controller的show和create action简写 其中:id会被转车一个参数...

  • rails 方法和对象

    rails 路由(rails 通过路由配置表来转发url动作) 路由表的功能: 接收识别http 请求 处理url...

  • rails 路由学习1

    rails config/routes.rb 指定路由的代码如下 上面的代码定义了5种风格的路由,rails在启动...

  • Rails 路由学习笔记

    参考 RailsGuides中的Rails Routing from the Outside In 简介 Rail...

  • Routes 路由

    Rails路由种类 (一般路由,命名路由) 使用 :except排除某个路由resource :posts, :e...

  • Rails路由

    资源路由 一行代码完成资源资源路由声明: 这会创建7个不同的路由,这些路由会映射到 Photos 控制器上。 这样...

  • rails 环境配置

    ruby 的各种概念 环境配置 工具配置 rails路由配置 (routes.rb) rails 命令 实例如下:...

网友评论

      本文标题:rails路由学习2-journey

      本文链接:https://www.haomeiwen.com/subject/itvbjftx.html