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应用
<%=yield%>
上面的代码通过调用yield方法,将被装饰页面中的内容包含到这个装饰页面中来,这样做的含义是:用户浏览任何页面时,实际看到的都是这个母版和被装饰页面组合输出的结果。
接着,定义/app/views/user/register.rhtml视图文件,代码如下。
<%=error_messages_for'user'%> <%=start_form_tag:action=>'register'%>
<%=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视图文件。其代码片段如下: