Rails中文教程

前言

Rails框架从诞生的第一天开始就受到了B/S应用开发领域的广泛关注,经过大约几年发展,Rails框架已经逐渐成熟稳定起来,国外已有相当多的公司开始选择从Java EE平台过渡到Rails开发平台。毕竟,Rails平台提出了一个非常具有诱惑力的口号:开发效率是Java EE开发平台的10倍,这个口号正确与否不是笔者所关心的,但Rails 确实具有很好的开发效率,而且很难出错:在Java EE开发领域,你需要掌握很多框架,详细了解每个框架的各种特性,你才可以组合出一套适合自己的开发平台。但在Rails 领域,你无需选择,你只要按Rails平台的约定开发,一切都会非常合理,非常优雅。

Rails平台不仅提供了整套的MVC解决方案,并且提供了丰富的代码生成器。Rails 甚至不完全是一个框架,更像一个企业开发平台,它搭建了整个应用开发的骨架,并提供了大量的代码生成器来辅助开发,开发者只需在系统生成的代码骨架上进行适当修改、定制即可完成应用的开发。选择使用Rails作为开发平台,仿佛上了铁轨的火车一样,火车只管向前运行,铁轨将负责把火车带到最终目的地(Rails就是铁轨的意思)。

Rails框架对迭代式的增量开发有很好地支持,即使系统的数据库需要重新设计、需要增加系统实体,Rails一样能够轻松面对(本书第2章示范了这种过程)。迭代式的增量开发正是敏捷开发的核心之一,这也是Rails框架被称为敏捷开发框架的原因。不仅如此,由于客观世界的复杂性,需求的变更常常是许多开发者最头疼的事情。使用了Rails开发平台后一切都改变了:Rails替你做好了拥抱改变的准备。

本书内容结构

本书分成4篇:

第1篇(第1~2章)主要介绍了Ruby on Rails的基本知识,包括搭建Ruby on Ra ils开发平台,第2章则介绍了一个Ruby on Rails的入门项目,让读者体验Rails敏捷开发,从而感受Rails平台的魅力。

第2篇(第3~10章)主要介绍Ruby语言基本知识,Rails平台选择Ruby作为开发语言,而且Rails框架本身也是使用Ruby语言开发的,因此Ruby语言基本知识也是本书介绍的重要内容。本书详细介绍了Ruby语言的相关语法,包括Ruby面向对象特征,Ruby的迭代器、正则表达式支持、异常处理等基础知识,也包括Ruby的多线程、IO和网络通信等高级内容。

第3篇(第11~16章)主要介绍Rails框架,详细介绍了Rails的模型(M)、视图(V)和控制器(C)各部分的解决方案,也讲解了Rails的邮件支持和Ajax支持,以期读者能充分掌握利用Ruby on Rails开发B/S结构应用的相关知识。

第4篇(第17~18章)是案例部分,介绍了两个案例:在线考试系统和电子拍卖系统,两个系统分别属于电子学习领域和电子商务领域,极具代表性。案例的实体包括复杂的1-N 多重关联映射,对于实际企业开发有很好的示范意义。不仅如此,案例还充分利用了Rails 提供的Ajax 支持来改善用户体验,具有很好的指导作用。

本书有什么特点

当《Struts 2权威指南——基于WebWork 核心的MVC 开发》一书问世以来,笔者收到很多读者来信,他们告诉笔者,非常喜欢书中介绍知识的方式:简短的文字介绍知识点的原理、小巧的案例介绍知识点的用法,最后指出知识点的实际应用场景。本书也保持了这一风格,依然坚持用案例来说话,希望带给读者Ruby on Rails 如此简单的感觉。

虽然笔者现在不再是一个全职开发者,但笔者一直以程序员自居:程序员喜欢简单的东西,程序员的职责就是把复杂的事情简单化,然后交给计算机去干。所以笔者坚持认为:真正属于程序员的书应该是简单的,而不是难以阅读的。如果读者阅读本书时,觉得书里介绍的知识很简单,那就可以按书里的介绍进行Ruby on Rails 开发,那笔者撰写本书的目的也达到了。

本书由两位作者合作完成,两位作者有极好的互补关系。其中郭秋霞女士是美国Re actrix 公司Rails 项目组成员,具有丰富的Ruby on Rails 实际开发经验。本书之所以得以出版,也得益于她的多次敦促。笔者也从她的工作中看到Ruby on Rails 在国外的广泛应用,从而感受到Ruby on Rails 在国内“山雨欲来风满楼”的气氛。郭秋霞女士以她丰富的经验为基础,完成本书的全部案例部分,希望带给读者真实企业开发的感受,丰富的实际开发经验将让本书更加实用。

笔者在Rails 流行之初就对其抱以极大的热情(笔者曾模仿Rails 框架设计出Java 领域的“Rails”框架,希望有机会与读者分享)。笔者目前是一个软件设计的布道者,教过的学生有应届毕业生、有刚工作的程序员、也有具有多年开发经验的技术经理、技术总监,从而能感受到各种层次读者的学习痛苦,因此写作过程中针对性很强,希望通过本书能减少各种读者在学习过程中的痛苦。

本书写给谁看

读者阅读本书之前,应有一定的B/S 应用开发基础。本书适用于正在使用Ruby on Rails 进行应用开发的开发人员,渴望了解Ruby on Rails 框架的开发人员。尤其适合有初步的Java EE 开发经验,想从JavaEE 平台过渡到Ruby on Rails 开发平台的开发者。

本章要点

l

生成Rails 应用

l 基本数据库连接配置

l 使用基本代码生成器

l 基本约定规则

l 设置中文响应

l

改进Model

l 改进控制器

l 改进视图页面

l 体验敏捷开发

前面已经介绍了Rails 开发平台的各种相关知识,本章将向读者示范如何开发一个简单的Rails 应用,这个Rails 应用是一个简单的留言系统。

通过开发这个简单的留言系统,将向读者介绍Rails 中如何使用一句简单的命令来生成整个Web 应用的基本框架;如何使用代码生成器来生成应用程序的支架,实现C(Create)R(Read)U(Update)D(Delete)这些常用功能。

本章采用的开发方式是:随着客户需求的变更,应用的功能也可以逐渐改变、完善。通过这种开发方式,我们不难发现,使用Rails 开发平台开发应用既可以快速提供应用原型让用户体验,也可以迅速满足用户新的需求。这就是Rails 敏捷开发的魅力!

2.1创建第一个Web 应用

Rails 包含了功能强大的代码生成器和一系列能够简化开发的约定规则,这就使得Ruby on Rails 像是Web 应用开发中的一场革命,将程序员从以往令人头疼的繁重开发工作中解脱出来,从而可以轻松地享受编程的迅捷与快乐。

2.1.1生成Rails 应用及启动应用

Rails 提供了功能强大的代码生成器,当我们选择Rails 作为开发平台后,就可以使用它们来生成应用中的基本代码。这意味着我们不需要使用任何IDE 工具,就可以开发Rails 项目。不像开发一个Java Web 应用,如果不借助于任

何IDE工具,就需要手动地一点一点地新建文件夹、配置文件……使用Rails只需要一个命令。

我们先介绍Rails的第一个代码生成器:rails appName[options],该命令用于生成一个Rails应用的基本框架。其中,appName是该应用的名称,而options则是创建该应用的各种选项。

下面,我们使用rails命令来生成一个Rails应用。在DOS窗口输入如下命令:

rails firstApp

即可看到如图2.1所示的界面。

图2.1使用rails命令生成Rails应用

只要执行这条简单命令,Rails就自动为我们生成了一个基本应用所需要的文件夹和文件,也就是完成了一个Rails应用的建立工作。进入我们刚才执行rails命令的目录(由图2.1中可以看出笔者在G:盘根路径下),将可以看到一个firstApp的目录,这个目录就是我们所建立的Rails应用。

接下来,就可以启动刚刚建立的Rails应用了。在DOS窗口下切换到该应用所在的路径下,执行如下命令:

ruby script/server

上面的命令将会启动刚刚建立的Rails应用。实际上,该命令是通过应用script路径下的server文件来执行的。使用上面的命令启动firstApp应用,将在DOS窗口看到如图2.2所示的运行界面。

Rails所用的Web服

务器

图2.2启动Rails应用

从图2.2中可以看出,Rails应用所使用的Web服务器是WEBrick。WEBrick 是Ruby领域的Web服务器,就像Dot NET领域的IIS服务器,或者Java EE领域所使用的Tomcat,JBoss等。Web服务器的基本作用就是对外提供HTTP服务。当然,Web服务器的实现细节就不可能在这里深入展开了。

提示有的读者可能会感到奇怪:我们从来没有安装过什么WEBrick

服务器,机器上怎么会包含WEBrick服务器呢?读者不要忘记,我们

安装过Ruby和Rails,Ruby默认包含了丰富的软件,其中WEBrick

HTTP服务器就是其中之一。WEBrick服务器允许我们自定义文档根路

径,还可以像编写Java Servlet那样,编写Ruby领域的Servlet程

序。但对于Rails开发者而言,我们无须太关心WEBrick的底层细节。

上面使用的启动Rails应用的方式,是最基本的启动Rails的方式,它启动的是开发环境中的应用。我们可以通过在ruby script\server命令中使用一些选项,来指定Rails的启动方式,常用的选项如下。

●-p port(或--port port):指定运行Rails的端口。例如:ruby script \server-p3001。默认端口为3000。

●-b=ip(或--binding=ip):绑定Rails到指定的IP。默认IP为0.0.0.0。

●-e name(或--environment name):指定运行环境为test或development 或production。例如:ruby script\server-e production。

●-c=charset(或--charet=charet):为输出设置默认的字符集。例如:ruby script\server-c=GB2312。如果没有使用这个选项,则默认的字符集为UTF

-8。

●-h(或--help):显示该命令的帮助信息。

启动Rails应用之后,就可以在浏览器中浏览这个应用了。我们使用如图2.2中不带任何选项的方式启动Rails,在浏览器的地址栏输入“http:

//127.0.0.1:3000/”,即可看到如图2.3所示的界面。

图2.3firstApp应用

经过上面步骤,已经搭建了一个Rails应用框架。搭建一个Rails应用只需要一个命令就可以完成,这确实非常方便;当建立Rails应用之后,无须进行任何部署,只需一个命令就可启动Rails应用,这也是非常方便的事情。

为了方便读者观看本书中例子的运行效果,在所有例子的根路径下,都放有一个start.cmd文件,双击该文件,即可启动Rails服务器或控制台(启动控制台我们后面会讲到)。

提示当我们使用rails命令来建立Rails应用时,rails命令会在

firstApp应用的script路径下生成一个名为server的脚本,这个脚

本用于启动WEBrick服务器。

上面的Rails应用完全没有任何业务功能,这是肯定的!计算机永远也不知道我们想要什么,所以它无法帮我们实现太多具体功能。

但上面的Rails应用又包含了如下几个代码生成器。

●scaffold:生成某个模块的应用代码框架。

●controller:生成某个模块的控制器代码框架。

●model:根据数据表生成一个ActiveRecord模型类。

●mailer:生成一个邮件模块的代码框架。

●web_service:生成一个WebService模块的代码框架。

下面,我们来介绍如何使用scaffold代码生成器。因为在本章将要向读者示范的应用,就是在scaffold生成的支架的基础上改进而来的。

提示对于一个企业应用而言,需求变更是不可避免的事情,我们的

开发平台必须能正常应对这种需求变更。Rails平台提供了基本的代

码生成器,通过这些代码生成器可以很快地开发出应用的雏形。而这

个应用雏形具有很好的可扩展性,可以非常方便地添加新的功能,处

理应用程序的需求变更,这也就是敏捷开发的精髓。

2.1.2配置数据库

生成scaffold需要进行持久层访问,因此,我们必须先进行数据库配置。数据库配置写在firstApp应用的\config\database.yml文件中,打开该文件,看到如下代码(不包含注释)。

development:

adapter:mysql

database:firstApp_development

username:root

password:

host:localhost

test:

adapter:mysql

database:firstApp_test

username:root

password:

host:localhost

production:

adapter:mysql

database:firstApp_production

username:root

password:

host:localhost

上面的代码大致可分为三部分,每部分的结构相同,分别表示在开发环境(development)、测试环境(test)和产品环境(production)下的数据库配置。当我们使用rails命令生成一个应用框架后,这个database.yml文件中就已经默认有了绝大部分配置参数的值,我们只需在password:后增加连接数据库所用的密码,就可以告诉Rails系统如何连接数据库。而我们在开发一个Rails应用时,只需要关注development部分的代码即可。因此,我们只需为development 部分添加password参数的值。

提示Rails使用YML文件进行配置管理,YML文件和XML文件有大致

相似的格式和功能,但更加简洁。例如上面的代码中可以认为

development是一个父元素,该元素下有5个子元素,分别指定连接

数据库所用的适配器、数据库名、数据库用户名、数据库密码和数据

库服务所在的主机。

Rails应用的数据库配置方式,体现了Rails的约定优于配置的原则。Rails 约定:当一个Rails应用程序启动时,它会自动寻找根路径下的\

config\database.yml文件,查看当前运行环境(development或test或production)中的数据库连接部分,按照这部分的配置进行数据库连接。因此,当我们需要进行数据库连接时,只需要按照Rails约定的方式,在database.yml 文件中找到相应的运行环境的设置部分,添加其password的值。

此外,Rails默认是根据database.yml文件中名为development的数据库配置建立连接的。

注意更改数据库配置文件之后,必须重启服务器,才能使对数据库

连接所做的更改生效。

现在假设我们需要开发一个简单的用户注册、用户登录应用,为此,我们需要建立一个用户数据表来保存系统的注册用户,下面是创建用户数据表所使用的数据库脚本。

drop database if exists firstApp_development;

--创建数据库

create database firstApp_development;

use firstApp_development;

--创建用户表:users

create table users(

id int not null auto_increment,

--定义用户名字段:name

name varchar(100)not null unique,

--定义密码字段:password

password varchar(100)not null,

--定义主键

primary key(id)

);

在MySQL的控制台导入上面数据库脚本,就可以创建本应用的开发数据库和用户表。

2.1.3使用代码生成器生成支架

scaffold是Rails提供的一个功能十分强大的代码生成器,它可以生成一个简单应用雏形,这个应用雏形为某个实体生成基本的C(Create)R(Read)U (Update)D(Delete)操作,这个雏形应用就被称为支架。

使用scaffold代码生成器非常简单,即在DOS窗口进入Rails应用所在的路径下,然后执行如下格式的命令:

ruby script/generate scaffold模型名(控制器名)

上面格式的命令中,模型名为必选项,控制器名是可选项。

如果省略控制器名,则表示生成指定模型(Model)的基本的CRUD操作。所谓模型(Model),就是对应一个持久化实体的名称。Rail约定:数据库中的表对应模型中的一个类。例如数据库里有一个users数据表,而系统就可以对应一个User Model。这里,我们又看到了约定优于配置的好处,这些约定使得我们不必关心Rails的底层实现,只要按照Rails的约定,就能很容易地将数据层和持久层映射起来。必须指出的是,使用scaffold代码生成器时,Rails会检测

系统所配置的数据库里是否包含Model所需的数据表。

如果指定控制器名,则可以为指定的控制器生成关于指定Model的基本的CRUD操作。

提示正如前面介绍的,当我们使用rails命令来创建一个Rails应

用时,rails命令为script路径下生成了很多脚本,其中generate

就是一个代码生成器脚本,用它可以自动生成很多应用的框架代码。

现在,使用支架来为我们的firstApp应用生成支架。因为我们刚才为应用创建了一个users数据表,根据Rails的约定,它将会对应一个User Model。因此,我们可以为User Model使用scaffold代码生成器,即在DOS窗口进入Rails 应用所在的路径下,执行如下命令。

ruby script\generate scaffold User User

在DOS窗口中看到的执行结果如图2.4所示。

图2.4使用scaffold代码生成器

由图2.4可看到,使用scaffold代码生成器,生成了一系列的相关文件或文件夹。其中,自动在app/models路径下为我们生成了user.rb这个Model文件;在app/controllers路径下生成了Model对应的user_controller.rb控制器文件;在app/views路径下创建了一个user文件夹,该文件夹用于存放User 控制器调用的所有视图文件。

在firstApp应用的根路径下双击start.cmd批处理文件,启动WEBrick服务器,然后在浏览器的地址栏输入http://localhost:3000/user或http:

//127.0.0.1:3000/user(假定读者在本机启动Rails应用),将会在浏览器中看到list页面。该页面用于列出所有用户对象,因为我们的数据库中目前没有任何的用户,所有页面中没有列出任何用户。单击“New user”链接,即可进入添加用户的页面,如图2.5所示。

由图2.5可知,由scaffold生成的添加页面是十分简单和不美观的。毕竟,这只是Rails为我们生成的最基本的视图模板。不过没关系,本章的后面会向读者介绍如何定制个性化视图。

在图2.5所示的页面中输入数据后提交,将会重定向到list页面,并在该页面上显示成功信息。浏览器中将会看到如图2.6所示的效果。

图2.5使用scaffold生成的添加用户页面图2.6使用scaffold生成的用户清单页面

从图2.6可看出,该页面中除“New user”链接之外,还包含了“Show”、“Edit”和“Destroy”链接,这正是对应scaffold代码生成器的基本功能:生成对特定Model的CRUD操作。这对于快速迭代开发是非常有帮助的,还可以让客户在非常短的时间内看到系统的雏形。

2.2完善第一个Web应用

在这一节里,我们将在上一节使用scaffold生成了支架的基础上,进一步改进和

完善这个firstApp应用。下面先为该应用增加两个功能:用户注册和用户登录。下面

将依次按照应用中的视图部分、控制器部分和模型部分的顺序,向读者详细讲解如何改进它们。

2.2.1使用中文响应

在讲解改进这两个模块之前,为了方便读者看这个firstApp应用的效果,我们先将Rai ls应用默认的英文响应改为中文响应。这很简单,只需在该应用的/app/controllers

路径下的application.rb控制器文件中添加如下代码。

#将set_charset方法定义成一个before过滤器

before_filter:set_charset

#该方法用于设置字符集

def set_charset

@headers["Content-Type"]="text/html;charset=gb2312"

@response.headers["Content-Type"]="text/html;charset=gb2312"

suppress(ActiveRecord::StatementInvalid)do

ActiveRecord::Base.connection.execute'SET NAMES gb2312'

end

end

上面的代码调用before_filter方法,将set_charset方法定义为一个before过滤器。在application.rb控制器文件中定义的before过滤器,可以使Rails在调用应用中的所有方法前先调用before过滤器定义的方法(这里是set_charset方法)。set_ charset方法将字符集设置为gb2312,因而,就能使本应用中的视图以中文显示。

提示关于界面中文化的更详细介绍,请参考本书13.1节。

2.2.2改进用户注册

在刚才scaffold为我们生成的支架中,增加用户的代码部分可以改进为用户注册模块。我们可以将/app/views/user路径下的new.rhtml视图文件重命名为register.r html视图文件。

提示RHTML文件就是Rails应用里的视图页面,RHTML页面的作用有点类似于J

ava EE应用里的JSP页面。

当我们定义了一个RHTML视图文件后,就可以通过浏览器来直接浏览该页面了。因此,如果我们直接在浏览器地址栏中输入http://localhost:3000/user/register,就可以在浏览器中看到如前面2.1.3节中图2.5所示的效果。但这个页面十分简陋和不美观,下面我们来美化它。

为了对应用界面进行简单美化,我们在firstApp应用的/public/stylesheets路径下添加一个message.css文件,该文件中包含了我们自定义的CSS样式。

然后进入/app/views/layouts路径下,我们可以看到默认的user.rhtml视图文件。该文件是/app/views/user文件夹中所有视图文件的装饰页面(即母版)。

提示装饰器页面的作用类似于Java EE应用里SiteMesh框架的作用,它提供

了简单的方法来为整个应用生成统一的页面风格。

修改user.rhtml视图文件,新的代码如下。

====第一个Web应用的标题====

第一个Web应用

<%=yield%>

上面的代码通过调用yield方法,将被装饰页面中的内容包含到这个装饰页面中来,这样做的含义是:用户浏览任何页面时,实际看到的都是这个母版和被装饰页面组合输出的结果。

接着,定义/app/views/user/register.rhtml视图文件,代码如下。

<%=error_messages_for'user'%>

<%=start_form_tag:action=>'register'%>

bgcolor="#F9CC76">

-->

<%=observe_field(:user_name,

:frequency=>0.5,

#指定更新update元素

:update=>:result,

:url=>{:action=>:check_name})%>

注册
用户名

<%=text_field("user","name",:size=>"20")%>

密码<%=password_field("user","password",:size=>"20")%>

<%=submit_tag'提交'%>

<%=end_form_tag%>

Rails提供了丰富的帮助方法,可以在视图文件中直接调用,其中的一些帮助方法可用来生成Html标签,如:start_form_tag,text_field,password_field和submit_ tag等。而error_messages_for帮助方法则返回ModelUser对象在校验时的错误信息。

如果用户请求URL对应的Action不存在,则Rails自动使用该控制器对应的视图模块里的同名RHTML页面来生成响应,所以,我们可以先不在user_controller.rb控制器文件中定义register方法,如果用户向http://localhost:3000/user/register 发送请求,则该register.rhtml页面将对该请求生成响应。

注意虽然我们可以不为一个RHTML页面提供空Action方法(也就是在控制器

类里定义的一个方法),但这不太符合MVC的模式。MVC模式认为,所有用户请

求都应该向Action发送,而不是直接发送给视图页面,视图页面只负责向用户

输出响应。为此我们建议为每个RHTML视图页面都提供一个Action方法,即使

该方法是空方法。

值得注意的是:上面的代码中,我们通过调用Rails提供的observe_field方法来执行Ajax调用,它负责检测名为user_name的表单域,每隔0.5秒执行一次check_nam e Action,这个Action将会返回用户输入的用户名是否已经被占用,并将返回的结果通过id为results元素输出。

由于上面的register.rhtml视图文件中进行了Ajax调用,因而需要在/app/views/lay outs/user.rhtml文件中包含JavaScript库,使得系统支持Ajax调用。包含系统中J avaScript库的代码片段如下:

<%=javascript_include_tag:defaults%>

将上面的代码添加到user.rhtml文件中的head标签内即可。

接下来,在user_controller.rb控制器文件中,将原来scaffold代码生成器生成的cr eate方法改为register方法,并修改该方法的定义。修改后的代码片段如下:

def register

#如果用户请求不是一个POST请求

if request.method!=:post

#构造一个User对象(没有初始化)

@user=User.new

#否则(用户请求是一个POST请求)

else

#构造一个User对象,并使用参数进行初始化

@user=User.new(params[:user])

#如果User对象能够成功保存进数据库(通过了有效性验证)

if@user.save

#将提示信息写进flash[:notice]

flash[:notice]='您已注册成功!请登录!'

#重定向到login控制器的login Action

redirect_to:action=>'login'

#否则

else

#提交给register Action

render:action=>'register'

end

end

end

register方法的定义中,首先判断用户请求是否为一个POST请求,如果不是,则只是创建一个没有初始化的User对象;如果请求为POST请求,则创建一个使用user 参数进行了初始化的User对象,该对象再调用save方法。在执行save方法的过程中,Rails会调用一个validate方法来对Model对象进行校验。如果User对象通过模型校验,系统将重定向到login Action;否则,仍然提交给register Action。

由于我们的注册页面设计有检测用户名的功能,需要向check_name Action发送Ajax 请求,因此,在这个控制器文件中需要定义check_name方法。代码片段如下:

def check_name

#observer_field使用text_field的当前值作为传递给Action的POST数据

#因此,我们在“控制器”中使用request.raw_post来访问这个数据

@name=request.raw_post||request.query_string

#查找name属性的值与@name参数匹配的User对象

@user=User.find_by_name(@name)

#提交时不使用layout模板

render(:layout=>false)

end

从上面的代码注释可知,由于observer_field方法将text_field的当前值直接发送给Action,因此我们使用request.raw_post||request.query_string来取得请求参数。一旦取得用户参数后,我们从数据库中查找出一条name列的值与用户参数匹配

的记录,将该记录对应的User 对象发送给客户端作为响应。

该User 对象数组提交给check_name 视图,该视图对应check_name.rhtml 页面。该页面代码如下:

<%if !@user.nil?%>

<%=h @name %>用户名已经被注册,请重新选择一个!

<%else %>

<%=h @name %>用户名可用!

<%end %>

然后,我们在user.rb 模型文件中重写validate 方法,对User 对象的模型校验进行定义。代码片段如下:

def validate

#验证name 不能为空

errors.add("","用户名不能为空")if name.empty?

#验证password 不能为空

errors.add("","密码不能为空")if password.empty?

end

Rails 在构造一个Model 对象时,会自动为该对象创建一个Errors 对象,用于存储模型校验过程中的错误信息。因此,先通过添加错误信息进入该对象中,然后在视图文件中调用error_messages_for 帮助方法,即可返回这些错误信息。

在浏览器的地址栏中输入http://localhost:3000/user/register ,打开用户注册页面。我们在第一个文本框内输入一个用户名,然后等待0.5秒。如果该用户名已经被占用,将看到如图2.7所示的页面。

图2.7用户注册时检测用户名

由图2.7可看到,我们输入的用户名是不可用的。页面中出现红色的提示信息“用户名已经被注册,请重新选择一个!”。如果输入的用户名在数据库中不存在,则会提示“用户名可用!”

在注册页面中输入合法的数据,然后单击“提交”按钮,系统将会重定向到login Action,并在登录页面中显示“您已注册成功!请登录!”的提示。下一节,我们就开始实现登录功能。

2.2.3实现用户登录

我们希望firstApp应用中具有用户登录功能,并且在用户登录页面中提供用户注册的链接。

由于scaffold生成器生成的文件中,没有类似用户登录的页面,因而我们自己在/app/ views/user路径下新建一个login.rhtml视图文件。其代码片段如下:

<%if@flash[:notice]-%>

<%=@flash[:notice]%>

相关主题
相关文档
最新文档