Ruby on Rails 资料.docx
- 文档编号:4628034
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:21
- 大小:29.11KB
Ruby on Rails 资料.docx
《Ruby on Rails 资料.docx》由会员分享,可在线阅读,更多相关《Ruby on Rails 资料.docx(21页珍藏版)》请在冰豆网上搜索。
RubyonRails资料
RubyonRails:
控制器纵览
在一个基于MVC的Web应用程序中,应用程序逻辑以及数据的存取是由MVC中的C,也就是控制器来完成的。
因此,深刻地理解MVC框架所提供控制器对于开发一个高效、可升级、稳定的应用程序是十分必要的。
RoR也不例外。
RoR中所提供的控制器叫动作控制器(ActionController)。
本文将主要讨论动作控制器所提供的几种服务,以及如何使用动作控制器。
什么是动作控制器
在RoR中,动作包(ActionPack)是这个框架的核心。
它包括两部分,动作视图和动作控制器。
动作包的一个特点是除了Web程序,不能使用在其它类型的程序中。
下面让我们看看在我们通过浏览器键入一个URL后,如http:
//localhost:
3000/demo/say/hello,都发生了什么。
下面是在RoR中处理动作的步骤:
1.RoR首先装载了位于app/controllers目录中的say_controller.rb文件。
这个文件只被装载一次。
2.然后RoR建立了类SayController的实例。
3.一旦SayController类被实例化,RoR就会在app/helpers中查找say_helper.rb文件。
如果这个文件存在,它就会被装载,并且这个文件将会和SayController对象混合。
这就意味着在SayController对象中可以直接访问SayHelper中的方法。
4.最后在app/models中查找say.rb文件,如果存在,装载它。
到现在为止,我们已经对应用程序的初始化过程非常清楚了,接下来让我们继续看看动作控制器所提供的服务。
下面是RoR所提供的服务列表:
1.URL映射
2.会话跟踪
3.过滤和验证
4.缓冲
现在又带来一个问题。
这些服务为什么由控制器来提供。
当然,答案也很简单,这是因为控制器介于数据和应用程序之间,因此,它可以监视数据的存取,并且可以根据需要对URL进行映射。
因此,这些服务理所当然由控制器来提供。
下面我们将详细讨论控制器提供的这些服务。
1.URL映射
当我们在浏览器中输入http:
//localhost:
3000/admin/show时,会显示相应的内容。
但你也许会有疑问,RoR是如何将URL链接映射成相应的类或方法呢?
事实上,这些映射的代码都被写在了config目录中的routers.rb中。
下面是这个文件的部分代码。
ActionController:
:
Routing:
:
Routes.drawdo|map|
map.connect':
controller/service.wsdl',:
action=>'wsdl'
map.connect':
controller/:
action/:
id'
end
动作控制器通过它的映射组件将来自外部请求的URL和内部的应用程序连接了起来。
上述代码的第3行就是完成这个功能的。
在这行语句中,map.connect的连接字符串是":
controller/:
action/:
id"。
请求的URL只有匹配这个字符串才能被接受。
对于一个URL请求来说,它可以被RoR分成三部分:
a.第一部分是模式字符串中的:
controller部分。
b.第二部分是模式字符串中的:
action部分。
c.第三部分是模式字符串中的:
id部分。
根据上面所描述的三部分,URL:
http:
//localhost:
3000/demo/admin/show/1/将被映射成以下三部分:
:
controller:
'admin',
:
action:
'show',
:
id:
1
根据以上的三部分,RoR将调用admin控制器的show方法,并将参数1传到show方法中。
因此,我们可以看出,RoR在其中做了很多本应该由我们做的事件。
因此,RoR是一项十分强大技术。
2.会话跟踪
跨应用跟踪用户是大多数Web应用程序都需要的功能。
在RoR中,我们可使用由RoR框架提供cookies或session管理来跟踪用户。
但在RoR中的cookies和session管理和其它框架所提供的类似的管理不同的,RoR的cookies和session管理无需显式地调用相应的cookies和session对象就可以做到这一切。
下面让我们来看看它的实现代码:
classCookiesController defcreate_cookie cookies[: the_time]=Time.now.to_s redirect_to: action=>"action_two" end defget_cookie cookie_value=cookies[: the_time] render(: text=>"#{cookie_value}") end end 在以上代码中,在控制器中有两个动作方法,一个是设置cookie的,另一个是读取和显示cookie值的。 在这里cookies[]是一个cookies对象数组,我们不需要声明它,只需要将它看成一个普通数组即可。 接下来使用redirect_to方法通过参数: action将请新进行重定向。 在get_cookie动作中,cookies的值被取出来,然后使用render()方法显示这些值。 上面讨论cookie的使用方法。 但如果有一种方法可以透明使用cookie,那不是更好吗? 这个技术就是session。 就象cookie一样,session数组也无需声明。 它的用法类似于cookie对象。 下面的代码描述了session的使用。 classSessionController deflogin user=User.find_by_name_and_password(params[: user],params[: password]) ifuser session[: user_id]=user.id redirect_to: action=>"index" else reset_session flash[: note]="有户名或密码不正确! " end end 上面代码对user_id和password进行核对。 如果用户存在,将这个用户的user-id保存在session中。 其中session[: user_id]=user.id的形式和保存cookie的形式完全一样。 接下来重定向到index页上。 如果用户不存在,使用reset_session将session设为无效,并通过RoR返回简单的提示信息。 3.过滤和验证 在一此情况下,在请求被处理之前,要进行一系列处理。 这个过程就叫做过滤。 过滤器所包含代码需要在许多动作执行前或执行后被调用。 因此,过滤器分为两种,before过滤器和after过滤器。 Before过滤器的代码在请求被处理前被执行,而after过滤器恰恰相反,是在请求被处理之后执行过滤代码。 例如,验证用户身份代码必须要在调用一个动作之前被调用,代码如下示: defauthorize unlesssession[: user_id] flash[: notice]="请登录" redirect_to(: controller=>"login",: action=>"login") end end classAdminController before_filter: authorize …… 以上代码在AdminController中的任何动作被执行之前调用,而在控制器中要想调用authorize函数,必须在其中加上before_filter。 after_filter的使用方法和before_filter类似。 过滤器虽然可以执行验证代码,但有时对请求需要更进一步的验证,如此一来,过滤器就显得捉襟见肘了。 为了完成这些功能,我们就需要使用更为强大的验证机制。 在控制器中,可以通过verify实现更强大的验证功能。 如下面的代码验证了用户提交方式。 即用户只能用post进行提交。 classBlogController verify: only=>: post_comment, : session=>: user_id, : add_flash=>{: note=>"Youmustlogintocomment"}, : redirect_to=>: index …… 4.缓冲 从以上代码可看出,服务器总是一遍一遍调用同样的动作,如果调用这些动作很费时间的话,将会严重影响服务器的性能。 因此,RoR为了解决这一问题,为我们提供了缓冲的功能。 如果某一个动作经常被调用,将这个动作进行缓冲将是一个好主意。 在RoR中,可以通过caches_page来实现缓冲功能。 缓冲可分为不同的层次,如对整个网页进行缓冲,对动作缓冲,或是同时对网页和动作进行缓冲。 如在一个blog管理应用程序,将大家经常访问的内容进行缓冲的代码如下: classContentController before_filter: verify_premium_user,: except=>: public_content caches_page: public_content …… RubyonRails: 动作视图纵览 编辑推荐: 新兵战老将Ruby能否挑动Java? 本文将讨论RoR中提供的基础服务之一: 动作视图。 动作视图可以使你更快速地将数据展现给用户。 在本文中将介绍一些动作视图的服务,并且将举一个例子来说明如何使用动作视图。 在MVC模式中的V,即视图(View),它的作用是将数据以用户所需要的形式展现出来,和传统的模式不同的是,视图在展现数据时可以省去许多不必要的细节。 也就是说,任何基于MVC模式的框架(framework)都应该提供更容易的方法提取和显示需要的数据。 RoR就是这样的框架。 它将动作视图作为其核心组件之一。 在本文中,将主要讨论动作视图的基础服务。 第一部分介绍了和动作视图相关的服务。 在第二和第三部分讨论动作视图的一些基本功能,在最后一部分,将给出一个实例来说明如何使用动作视图。 动作视图的服务 视图的功能就是向用户展现数据。 下面列举了动作视图中的主要服务: ·模板 ·布局 ·分页 当然,在动作视图中还在很多的服务,但上面的三个服务在动作视图中是最重要的。 模板 所谓模板,就是在一个文件中预定义了一些共用的资源,应用程序通过使用这些共用的资源,可以简化应用程序的开发过程,从而达到重用的目的。 在动作视图中的模板所包含的资源主要就是布局信息、一些数据所存放的路径等。 在动作视图中的模板很多,如HTML格式的登录模板、以及Email模版等。 布局 从软件(包括Web和桌面程序)上来说,布局就是将GUI中的控件进行组织和安排,也就是说布局控制着GUI控件(如按钮、文本框等)如何被放置在界面上。 例如,布局可通过垂直等间距方式将要排列的控件按垂直方向等间距进行排列。 分页 分页的作用就是将大量的数据分批地显示在页面上,可通过"上一页"和"下一页"进行页间的切换。 分页有些象用打印机打一个大的文档,一张纸打不下,就将数据分成多张纸来打。 虽然将分页这种显示数据的方式应用到程序中可以解决大数据量显示的问题,但这同时又会带来另外一个问题,那就是如果对数据进行导航,也就是翻页问题。 除了以上提到的服务外,在动作视图中还有其它的服务,如格式化助手等。 但是上面所介绍的三个服务是动作视图中最重要的。 在下一部分,我们将讨论如何使用这些服务。 模板和格式化助手 动作视图为我们提供了很多建立动态视图的服务。 下面是动作视图提供的主要的服务: ·模版 ·格式化助手 ·分页 ·布局 上面的4种服务,除了格式化助手外,其它三个服务都已经在前面介绍过了。 模板 就象以前讨论的一样,在模板中包含了一些代码、标记、简单文本或它们的组合。 在其中的代码可以通过Controller中的访问信息提供动态的内容。 代码通过执行环境访问信息。 这个环境为代码提供了以下的信息: 1.Controller的实例变量,通过这些变量可以将数据从Controller传给模板。 2.作为存取器的Controller对象。 这些对象包括对象头、参数、请求、响应和会话。 3.当前正在使用的Controller对象。 模板代码可以从这个Controller对象中调用它的public方法。 在RoR中的模板是RHTML文件。 RHTML文件有些类似于JSP文件,在RHTML文件中有静态的HTML,也有动态的内容。 动态的内容可以由内嵌的代码生成技术产生,也可以用手工编写。 如以下的RHTML文件显示了当前的日期和时间: <h1>大家好! </h1> <p> <b> 当前日间: <%=Time.now%> </b> </p> 和JSP类似,在RHTML中有两种写动态代码的方法,一种是将代码写到<%=…%>中,另外一种是将代码写在<%…%>中。 在<%=…%>中的Ruby语句只是当作一个值返回,如果其中含有多条语句,则返回最后一条语句的值。 而将代码放到<%…%>中,则按着正常的程序逻辑执行。 虽然RHTML中可以执行Ruby语句,但最好不要将商业逻辑代码写在RHTML中。 代码的执行原理可看下面的例子。 如果有以下代码: <%5.timesdo%> <5> <%end%> 在执行RHTML时,将上述代码转换为Ruby语句: 5.timesdo puts"<5>" end 格式化助手 视图的一个重要功能就是可以将从Controller传过来的数据进行格式化,以便用户更容易理解这些数据。 RoR提供的格式化助手就是用来完成这个功能的。 格式化助手主要可以格式化三类信息: 数字、日期和文本。 下面将讨论如何使用格式化助手对这些信息进行格式化。 数字和日期格式化 格式化助手可以进行多种的转换工作,如将本地时间转换成另外一种形式,将数字转换成货币类型、百分比或电话号,下面是一些转换的例子: <%=distance_of_time_in_words(Time.now,Time.local(2006,11,1))%> 将得到4或其它的数字(根据你运行它的日期不同而不同) <%=distance_of_time_in_words(Time.now,Time.now+40,false)%> 将得到1分钟(40表示秒) <%=number_to_currency(99.99)%> 将得到$99.99 <%=number_to_percentage(66.6666)%> 将得到66.667% <%=number_to_percentage(66.66666,: precision=>1)%> 将得到66.7% <%=number_to_phone(1125551212)%> 将这个数字转换为112-555-1212 格式化文本 同样,格式化助手也可以格式化文本。 格式化操作包括截取字符串,加亮显示字符串中的子字符串,甚至可以将一个单词转换成复数。 下面是一些字符串的例子: 替换字符串的子串 <%=excerpt(@str,"you",8)%> 如果@str中的字符串是"Ilove…",那么就应该返回"Iloveyou" <%=highlight(@str,"love")%> 如果@str中的字符串是"Iloveyou." 那应该显示: I<strongclass="highlight">love</strong>you. 在字符串转换中,最有意思转换可能就是将英文单词的单数形式转换成复数形式(你可以用这个功能查一下单词的复数形式是什么)。 <%=pluralize(2,"person")%> 显示2people. 分页 在第一部分我介绍了分页的概念。 在这部分我将讨论如何通过RoR使分页变得更容易。 RoR通过控制层和视图层实现分页。 在控制层,RoR的分页系统控制从数据库中得到的记录。 在视图层显示从控制层得到的数据,以及用于分页显示的导航条。 下面的例子描述了将users表分页显示的过程: 控制层的实现: 在控制层,分页必须按如下代码实现: defuser_list @user_pages,@users=paginate(: users,: order_by=>'name') end 以上代码通过paginate方法设置的分页器。 这个方法有两个参数,第一个参数是要读取数据的表的名子,第二个参数是在取数据时要排序的字段。 这个方法返回两个对象,第一个对象@user_pages是分页器对象,第二个对象@users是每一页的记录数。 其中@users用来向视图提供要显示的数据。 而@user_pages负责从表中得到数据,然后将这些数据保存在@users中。 视图层的实现: 在视图层的RHTML文件中,@users中的数据将被展现给用户。 pagination_links()方法可以实现导航的功能。 以下是具体的实现代码: <table> <tr><th>姓名</th></tr> <%foruserin@users%> <tr><td><%=user.name%></td> <%end%> </table> <hr> <%=pagination_links(@user_pages)%> <hr> 看看上面的代码是不是很简单! ! 布局 在模板中可以通过布局提供子模板。 这就意味着RoR可以通过布局进行嵌套操作。 布局提供了一个典型网页的各种组成部分,如菜单、页脚等。 下面是一个简单的关于布局的例子。 <html> <head> <title>Form: <%=controller.action_name%></title> <%=stylesheet_link_tag'scaffold'%> </head> <body> <%=@content_for_layout%> </body> </html> 上面的代码是一个标准的HTML布局。 最值得关注的是变量@content_for_layout。 这个变量中保存了从控制层传过来的数据。 下面代码演示了如何从控制层传递数据到一个RHTML文件: defmethod @msg="测试! " end 下面是method.rhtml文件中的代码: <h1><%=@msg%></h1> 变量@content_for_layout的内容如下: <h1>测试! </h1> 由布局生成的HTML代码如下: <html> <head> <title>Form: method</title> <linkhref="/stylesheets/scaffold.css"media="screen"rel="Stylesheet"type="text/css"/> </head> <body> <h1>测试! </h1> </body> </html> 上面的例子只是简单地演示了如何使用布局。 在RoR提供的自动生成代码机制中的scaffold就是使用布局来生成的输出文件。 在下一部分将给一个简单的例子来演示如何使用模板和格式化技术。 实例 在这个例子中显示了一些被格式化的时间、字符串和数字。 下面的代码是控制层的代码: classSayController<ApplicationController defhello @time=Time.now end end 下面是视图层(这个文件就是一个模板)的代码: <html> <head> <title>你好! </title> </head> <body> <h1>现在报时: <%=@time%></h1> </body> </html> 现在让我们使用格式化功能: classSayController<ApplicationController defhello @time=Time.now @rule="Thisisarule" @price=123 end end 下面在视图中使用格式化助手进行格式化: <html> <head> <title>你好! </title> </head> <body> <br>现在报时: <%=@time%> <br>时间间隔: <%=distance_of_time_in_words(@time,Time.local(2006,10,11))%> <br>高亮度显示rule: <%=highlight(@rule,"rule")%> <br>将123转换成美元: <%=number_to_currency(@price)%> </body> </html> RubyonRails: 活动记录纵览 用RubyonRails来编写数据库管理系统是非常快速的。 RubyonRails之所以有如此高的生产率,不光是Ruby的语法灵活,而这一切在很大程序上是拜活动记录(ActiveRecord)所赐。 那么什么是活动记录呢? 如果用一句话来解释,那就是一个可以将数据映射成对象的框架(这有些类似于Hibernate)。 也许你会说: "这有什么,现在这种框架多得是,Hibernate不是也非常强大吗? ",但如果你用了RubyonRails(以下简称为RoR),你就会发现它和其它的同类框架是多么的不同,它比其它框架更容易使用,编程效率也更高,据官方说,使用RoR比使用Java和Hibernate的生产率高10倍(也许并没有这么夸张,但活动记录的数据映射的确比其它框架的数据映射的生产率高一些)。 无论是桌面程序还是基于Web的程序,数据处理始终是它们的核心。 数据可以使用不同的技术进行描述和处理。 这些数据处理技术之一就是对象关系映射技术,或者简称为ORM技术。 ORM技术将数据库中的数据表或视图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Ruby on Rails 资料