实例
这个登录程序非常简单。下面将描述这个程序的基本功能:
这个程序有一个窗口允许用户输入用户名和密码。在输入用户名和密码后,系统将会验证它们的合法性。在用户登录后,系统将这个用户的信息记录在session中,直到它们注销登录。
下面将描述组成系统的模块:
User.rb - 数据表(users)的映射
login_controller.rb - 控制前端和后端的数据流
login.rhtml - 显示登录界面
下面是建立users表的SQL语句:
create table users ( id int not null auto_increment, name varchar(100) not null, password char(40) null, primary key (id); }
接下来我们处理数据表映射类。由于我们正在使用RoR中的活动记录。因此,除了可以使用establish_connection方法连接数据库外,我们还可以使用config目录中的database.yml文件来描述数据库连接信息。如下是在database.yml的development中的设置情况:
development: adapter: mysql database: test encoding: gb2312 username: root password: 1234 host: localhost
然后使用以下命令建立数据表映射类User:
ruby script/generate model User
这个User类包含两个方法:try_to_begin(这个方法调用login方法)和login。代码如下:
class User < ActiveRecord::Base def self.login(name, password) find(:first, :conditions => ["name = ? and hashed_password = ?", name,password]) end def try_to_login User.login(self.name, self.password) end end
Login方法使用了find方法查询users表中的记录,并进行验证。这个方法的逻辑是非常简单的:try_to_login方法通过controller被调用。然后将用户名密码传入login方法中。Login方法返回包含用户名和密码的数据对象。
接下来我们使用如下命令建立控制类:
ruby script/generate controller Login
以下代码是控制类的实现,其中包括数据验证和处理session。
class LoginController < ApplicationController def login @user = User.new(params[:user]) logged_in_user = @user.try_to_login if logged_in_user session[:user_id] = logged_in_user.id redirect_to(:action => "index") else flash[:notice] = "不正确的用户名和密码!" end end end
下面是login.rhtml的代码
<% @page_title = "增加一个用户" -%> <%= error_messages_for 'user' %> <%= form_tag %> <table> <tr> <td>User name:</td> <td><%= text_field("user", "name") %></td> </tr> <tr> <td>密码:</td> <td><%= password_field("user", "password") %></td> </tr> <tr> <td></td> <td><input type="submit" value=" ADD USER " /></td> </tr> </table> <%= end_form_tag %>
到现在这个程序已经完成了。如果你将这个应用程序和使用其它语言编写的同样的应用程序相比,基于RoR的应用程序的代码是非常少的。本文只是对活动记录的主要功能进行简单的描述,如果读者对其感性趣,可以查阅相关的文档了解更详细信息。