在一个基于MVC的Web应用程序中,应用程序逻辑以及数据的存取是由MVC中的C,也就是控制器来完成的。因此,深刻地理解MVC框架所提供控制器对于开发一个高效、可升级、稳定的应用程序是十分必要的。RoR也不例外。
RoR中所提供的控制器叫动作控制器(ActionController)。本文将主要讨论动作控制器所提供的几种服务,以及如何使用动作控制器。
什么是动作控制器
在RoR中,动作包(Action Pack)是这个框架的核心。它包括两部分,动作视图和动作控制器。动作包的一个特点是除了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对象就可以做到这一切。下面让我们来看看它的实现代码:
class CookiesController < ApplicationController
def create_cookie
cookies[:the_time] = Time.now.to_s
redirect_to :action =>"action_two"
end
def get_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的使用。
class SessionController < ApplicationController
def login
user = User.find_by_name_and_password(params[:user], params[:password])
if user
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过滤器恰恰相反,是在请求被处理之后执行过滤代码。例如,验证用户身份代码必须要在调用一个动作之前被调用,代码如下示:
def authorize
unless session[:user_id]
flash[:notice] ="请登录"
redirect_to(:controller =>"login", :action =>"login")
end
end
class AdminController < ApplicationController
before_filter :authorize
… …
以上代码在AdminController中的任何动作被执行之前调用,而在控制器中要想调用authorize函数,必须在其中加上before_filter。after_filter的使用方法和before_filter类似。
过滤器虽然可以执行验证代码,但有时对请求需要更进一步的验证,如此一来,过滤器就显得捉襟见肘了。为了完成这些功能,我们就需要使用更为强大的验证机制。在控制器中,可以通过verify实现更强大的验证功能。如下面的代码验证了用户提交方式。即用户只能用post进行提交。
class BlogController < ApplicationController
verify
nly => :post_comment,
:session => :user_id,
:add_flash => { :note =>"You must log in to comment"},
:redirect_to => :index
… …
4. 缓冲
从以上代码可看出,服务器总是一遍一遍调用同样的动作,如果调用这些动作很费时间的话,将会严重影响服务器的性能。因此,RoR为了解决这一问题,为我们提供了缓冲的功能。如果某一个动作经常被调用,将这个动作进行缓冲将是一个好主意。
在RoR中,可以通过caches_page来实现缓冲功能。缓冲可分为不同的层次,如对整个网页进行缓冲,对动作缓冲,或是同时对网页和动作进行缓冲。如在一个blog管理应用程序,将大家经常访问的内容进行缓冲的代码如下:
class ContentController < ApplicationController
before_filter :verify_premium_user, :except => :public_content
caches_page :public_content
… …
分享到:
相关推荐
2. **ActiveRecord**:RoR的数据访问层,它将数据库操作与对象模型绑定,提供了ORM(Object-Relational Mapping)功能。 3. **路由**:Rails的路由系统将HTTP请求映射到特定的Controller和Action,定义了应用的URL...
在本文中,我们将探讨一些RoR性能优化的关键方面,主要基于JavaEye网站在使用RoR过程中积累的实际经验。 首先,RoR性能优化涉及到多个层面,包括应用程序的部署、服务器配置以及代码优化。在部署方面,操作系统的...
在RoR中,插件是一种可以扩展和定制框架功能的方式,它们通常包含模型、控制器、视图、帮助器以及其他相关的文件。这个插件可能解决了RoR在处理中文数据时的编码问题,使得用户无需访问特定网站下载,直接在项目中...
NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696
而“Ror”(Residual-of-Residual)则是对ResNet的一种扩展,进一步优化了网络的性能,尤其在图像分类任务上表现突出。 **ResNet模型核心思想** ResNet的核心是引入了“残差块”(Residual Block),通过引入一个...
2. **ActiveRecord**:这是Rails中的ORM(对象关系映射),它允许开发者用Ruby类和对象操作数据库,减少了对SQL的直接依赖。 3. **路由(Routes)**:Rails的路由系统将HTTP请求映射到控制器的行动上,并定义了URL...
在Ruby on Rails(ROR)开发环境中,安装和配置正确的依赖包是至关重要的。这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails...
在深入源代码之前,我们需要了解RoR的一些核心概念。如ActiveRecord,它是RoR中的ORM(对象关系映射)库,允许开发者用Ruby代码操作数据库,而无需编写SQL。另一个关键组件是ActionController,它处理HTTP请求并返回...
Ruby on Rails(简称ROR)是一个基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在促进开发过程的简洁性和效率。Ruby on Rails的核心理念是“Don't Repeat Yourself”(DRY,...
- **关联、验证及回调**:深入讲解ActiveRecord中的关联关系(如一对一、一对多等),以及如何进行数据验证和回调函数的应用。 - **ActionView表单**:学习如何在视图层构建动态表单,利用ActionView提供的模板...
基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。
本文将基于给定的文件信息,详细阐述如何在Rails应用中实现文件的上传与下载功能,包括数据库设计、视图构建、控制器逻辑以及模型处理等关键步骤。 #### 数据库设计与BLOB字段 在开始之前,首先需要设计一个能够...
本文将详细介绍如何在Windows系统上成功搭建Ruby on Rails开发环境,并分享一些个人经验,希望能对有意学习和使用Rails的朋友有所帮助。 #### 二、环境准备 在开始搭建前,请确保您的Windows系统已更新至最新版本,...
通过学习和实践《机遇ROR的图书管理系统》,你不仅能掌握Ruby on Rails的核心技能,还能提升对Web开发整体流程的理解,为未来开发更复杂的Web应用打下坚实基础。而提供的"EasyKey1.1.exe"可能是用于辅助学习的工具,...
在Java世界里,虽然Hibernate和JPA等框架已经非常成熟,但Ruby on Rails(ROR)中的ActiveRecord模式也受到了不少Java开发者的青睐,并有了一些移植到Java平台的实现。 ActiveRecord是一种对象关系映射(ORM)模式...
在《Programming Ruby 2nd》中,作者深入浅出地讲解了Ruby语言的基础语法、类与对象、模块、方法、块、 Proc 和 Lambdas、变量、常量、控制结构、异常处理等核心概念。此外,书中还探讨了Ruby的元编程特性,这是Ruby...