`
shangjava
  • 浏览: 1236664 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Ruby On Rails-2.0.2源代码分析(3)-named route

阅读更多
  • 前言

在《Routing的载入》中,我大致介绍了一下Rails中最简单的route是如何加载的。这篇文章,我将来讲一讲Rails系统中更为复杂的named route和与RESTful相关的resource是如何被加载的。为了不重复太多的笔墨,这篇文章将在前文的基础上进行,如果发现单独看此文时,有少许云里雾里,建议先看一看我的前篇文章:Ruby On Rails-2.0.2源代码分析(2)-Routing的载入

  • 进化的routing-named route

首先,named route的载入全部发生在routing.rb中。其实named route一点也不比普通的route高深些什么,Rails内部最终也是将named route解析为一个普通的route保存在RouseSet类的routes数组中(还记得这家伙么?最好牢牢记住他,因为,他还会在后续文章中继续登台发挥重要作用),之所以我称他进化,是因为named route既然提供了name,在Rails内部,将会生成一系列的helper方法,当我们在controller或者view中使用link_to,redirect_to等方法时,不需要指定相应的controller和action,从而简化我们的代码,不用多了,先来看一看我们所熟悉的routes.rb

Ruby代码 复制代码
  1. ActionController::Routing::Routes.drawdo|map|
  2. map.purchase'products/:id/purchase',:controller=>'catalog',:action=>'purchase'
  3. ...
  4. end


这里,我定义了一个purchase的named route(当然,你完全可以使用connect方法定义普通的route)。前一篇文章提到过,block中的map对象是Mapper类的实例,其实你可以想象到,其实Mapper类并没有定义purchase方法(天知道你要给你的named route起啥名?翠花?旺财?)。所有的一切,都是通过Mapper类的method_missing方法处理的。具体代码如下:

Ruby代码 复制代码
  1. defmethod_missing(route_name,*args,&proc)#:nodoc:
  2. superunlessargs.length>=1&&proc.nil?
  3. @set.add_named_route(route_name,*args)
  4. end


如果你记性还好,应该还记得@set对象是一个RouteSet类的实例,所以这里Mapper类将这个route的名称,还有所有的参数都传递到了RouteSet类的add_named_route方法。

Ruby代码 复制代码
  1. defadd_named_route(name,path,options={})
  2. #TODO-isoptionsEVERused?
  3. name=options[:name_prefix]+name.to_sifoptions[:name_prefix]
  4. named_routes[name.to_sym]=add_route(path,options)
  5. end


这里,看到我们前面已经熟悉过了的add_route方法了吧?对此方法不用再过多解释,Rails将生成一个普通的route,保存在RouteSet的routes数组中,并将这个route返回,赋给named_routes对象,此对象是NamedRouteCollection类的一个实例。在NamedRouteCollection中有如下定义:

Ruby代码 复制代码
  1. defadd(name,route)
  2. routes[name.to_sym]=route
  3. define_named_route_methods(name,route)
  4. end
  5. defget(name)
  6. routes[name.to_sym]
  7. end
  8. alias[]=add
  9. alias[]get


所以,接下来似乎应该关心下add方法了。这里,首先将此普通的route保存在NamedRouteCollection类的routes哈希中(注意和RouteSet的routes数组区分开来)。然后,named route开始其“进化”了----通过define_named_route_methods方法生成自己的一系列helper方法。

Ruby代码 复制代码
  1. defdefine_named_route_methods(name,route)
  2. {:url=>{:only_path=>false},:path=>{:only_path=>true}}.eachdo|kind,opts|
  3. hash=route.defaults.merge(:use_route=>name).merge(opts)
  4. define_hash_accessroute,name,kind,hash
  5. define_url_helperroute,name,kind,hash
  6. end
  7. end


或者你已经知道了,named route有name_url,和name_path两类helper方法,从上面这段代码中,我们能看到真正的实现。Rails这里为url和path分别生成hash access和url helper方法,其实现都利用了ruby强大的动态特性。具体实现分别如下:

Ruby代码 复制代码
  1. defdefine_hash_access(route,name,kind,options)
  2. selector=hash_access_name(name,kind)
  3. @module.module_eval<<-end_eval#Weusemodule_evaltoavoidleaks
  4. def#{selector}(options=nil)
  5. options?#{options.inspect}.merge(options):#{options.inspect}
  6. end
  7. protected:#{selector}
  8. end_eval
  9. helpers<<selector
  10. end
  11. defdefine_url_helper(route,name,kind,options)
  12. selector=url_helper_name(name,kind)
  13. #Thesegmentkeysusedforpositionalparamters
  14. hash_access_method=hash_access_name(name,kind)
  15. @module.module_eval<<-end_eval#Weusemodule_evaltoavoidleaks
  16. def#{selector}(*args)
  17. #{generate_optimisation_block(route,kind)}
  18. opts=ifargs.empty?||Hash===args.first
  19. args.first||{}
  20. else
  21. options=args.last.is_a?(Hash)?args.pop:{}
  22. args=args.zip(#{route.segment_keys.inspect}).inject({})do|h,(v,k)|
  23. h[k]=v
  24. h
  25. end
  26. options.merge(args)
  27. end
  28. url_for(#{hash_access_method}(opts))
  29. end
  30. protected:#{selector}
  31. end_eval
  32. helpers<<selector
  33. end


其中@module是NamedRouteCollection类中的一个匿名module,他通过module_eval方法动态的增加了这一系列的helper方法,并且将方法名保存在helpers数组当中,以供其后controller或者view的使用(link_to, redirect_to)。至此,named route的加载就全部完成了。十分简单,不是吗?

本文转自:http://woody-420420.javaeye.com/blog/174352

分享到:
评论

相关推荐

    Ruby on Rails安装指南(Ruby 1.8.6+Rails 2.0.2)

    随着互联网的快速发展,Ruby on Rails作为一种流行的Web开发框架,在开发领域得到了广泛的应用。它的简易性与高效性让许多开发者为之青睐。而想要在本地环境搭建Ruby on Rails的开发环境,掌握正确的安装步骤是基础...

    Ruby On Rails-Cheatsheet

    ### Ruby on Rails Cheat Sheet 本篇文章将从给定的文件中提炼出关于Ruby on Rails的重要知识点,主要包括命令、URL映射、命名规范、ERB标签、链接创建、数据库配置及查询、模型之间的关系等方面。 #### Ruby on ...

    行为驱动设计: Professional Ruby on Rails - Chapter 7

    3. **创建步骤定义(Step Definitions)**:在Ruby代码中为Gherkin步骤编写对应的实现,将自然语言转化为可执行的代码。 4. **运行测试**:执行特性文件,验证系统是否按预期工作。BDD工具如Cucumber会自动匹配并...

    ruby on rails源代码分析

    在本文中,我们将深入分析 Ruby on Rails 2.0.2 的源代码,特别是关注其启动过程。 首先,Rails 的启动始于 `config/boot.rb` 文件。这个文件是 Rails 应用程序的入口点,负责检查 Rails 是否已启动。如果没有,它...

    Ruby on Rails入门经典代码

    本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习Rails的宝贵资源,帮助初学者快速掌握这个强大的框架。 1. **Rails基础知识**: - MVC架构:Rails的核心设计模式,模型负责数据处理,视图负责展示,控制器...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    ### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...

    rails-dev-box, 面向 Ruby on Rails 核心开发的虚拟机.zip

    rails-dev-box, 面向 Ruby on Rails 核心开发的虚拟机 用于 Ruby on Rails 核心开发的虚拟机简介注意:这个虚拟机不是为 Rails 应用程序开发而设计的,只是为。 这个项目自动设置开发环境,以便在 Ruby on Rails ...

    Ruby-on-Rails-3.rar_site:www.pudn.com

    《Ruby-on-Rails-3.rar》是一个在Pudn网站上分享的压缩文件,主要针对的是希望通过Ruby语言进行Web开发的初级程序员。该资源的核心内容是《Web开发敏捷之道 - 应用Rails进行敏捷Web开发 - 第三版》这本书的PDF版本。...

    Ruby-on-Rails-rails.zip

    Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_...

    Ruby on Rails安装包全集(Linux)

    这里的是FastCGI的源代码包,它允许Ruby on Rails应用通过FastCGI协议与Lighttpd交互。 5. **ruby-zlib-0.6.0.tar.gz**: Zlib是用于数据压缩的库,Ruby的内置标准库中包含了对Zlib的支持。此包可能用于Ruby与Gzip等...

    Ruby On Rails开发实例-源代码

    Ruby on Rails(简称RoR或Rails)是一种基于Ruby语言的开源Web应用框架,它遵循Model-View-Controller(MVC)架构模式,旨在使Web开发更简洁、高效。本实例将帮助你深入理解和实践Rails的开发流程。 首先,让我们从...

    ruby1.8.6 + rails2.0.2 安装配置 详细说明

    接下来,Rails 2.0.2是Ruby on Rails的第二个主要版本,它引入了许多改进和新特性。这个版本的Rails强调了“Convention over Configuration”(约定优于配置)的理念,使得开发过程更加高效。安装Rails需要先确保...

    Ruby on Rails 教程 - 201406

    本教程“Ruby on Rails 教程 - 201406”可能是针对2014年6月时的Rails版本,那时候Rails正处于3.x或4.x系列,虽然现在Rails已经发展到6.x版本,但基础概念和核心原则依然适用。 在Rails中,Model负责处理数据和业务...

    Ruby on Rails Tutorial

    《Ruby on Rails Tutorial》中文版(原书第2版,涵盖 Rails 4) Ruby 是一门很美的计算机语言,其设计原则就是“让编程人员快乐”。David Heinemeier Hansson 就是看重了这一点,才在开发 Rails 框架时选择了 Ruby...

    ruby on rails 101

    ### Ruby on Rails 101:深入理解与实践 #### 引言 《Ruby on Rails 101》是一本介绍Ruby on Rails(简称RoR或ROR)的基础书籍,旨在为初学者提供一个全面而深入的学习框架。本书由Peter Marklund编写,包含了五天...

    Beginning Ruby on rails 源代码

    《初识Ruby on Rails:源代码解析》 Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web开发过程,提高开发效率。本资料包包含了...

    ruby on rails最新版

    Ruby on Rails,简称Rails,是基于Ruby编程语言的一个开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和代码的可读性。Rails以其“约定优于配置”(Convention over Configuration)...

Global site tag (gtag.js) - Google Analytics