ruby on rails 学习 (5):一个 rails 登录程序

     以命令流为本文线索:

     1) rails new echohall -d=mysql

     2) cd echohall

     3) rails generate model user

     4) rails generate controller login

      以上4步创建了 echohall application , users 数据库映射类和 login controller。下面对需要填写代码的地方予以解释说明。

      rails generate model user 后,rails 自动创建了user 类,user 类继承了 ActiveRecord::Base 类,使用 rails 方法生产 MVC 当中的 Model 是有好处的:你不用去关心具体的数据库 sql 语句,而只需对产生的几个文件进行填充。比方说之前在做 php 连接数据库的应用时,会需要先写好数据库并向其中填充一些记录以供开发和简单测试。我常用的做法是写一个 sql 文本文件,然后直接黏贴 sql 文本文件的内容到 mysql 命令行下执行。这个一个 sql 文本文件例子。然而在 rails 中不必这样进行。在 rails generate model user 时,我们的目的便是创建一个数据库表映射类,即是说,此时我们打算创建一个 users 表到数据库中, 而这个表会映射为 User 类,表中的每一行记录都会映射为 User 类的一个对象。我们命令中填写的是 user ,rails 操作数据库时会自动装便为 users 这种复数形式的表名(不知道是怎么做到的,要是遇到名称复数话不是简单的加 s 会怎么样?)。执行 generate model 命令后产生的几个文件是

     a) echohall/test/fixture/users.yml

      这是一个工具夹文件,主要用来辅助单元测试。需要更据文件中的提示填写记录: 如

# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html

# This model initially had no columns defined.  If you add columns to the
# model remove the '{}' from the fixture names and add the columns immediately
# below each fixture, per the syntax in the comments below
#
one: 
# column: value
  name: rereadyou
  email: rereadyou@gmail.com
  password: rereadyou
  gender: male

two: 
#  column: value
  name: fine
  email: fine@gmail.com
  password: rereadyou
  gender: male

     b) echohall/db/migrate 下以时间参数_create_users.rb 命名的文件如:20110424074950_create_user.rb

     这个是数据库移植文件,表示与具体数据库软件无关的表设置,例如下:

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :name, :string
	  t.column :email, :string
	  t.column :password, :string
	  t.column :gendar, :string
      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

     c) echohall/app/models/user.rb

     这个文件包含模型实际的类定义,先留空。

     d) echohall/test/unit/user_test.rb

     这个是单元测试文件,目前保持不变。

     以上四个文件产生的顺序可能不太正确,但这几个文件都是生产一个 model 时必然会产生的文件。

到这里,就可以进行数据库移植了,使用如下命令:

   5)  rake db:migrate

   这个命令的作用是移植数据库到 MySql 中,在 MySql 控制台中查看便知此命令创建了 echohall_development 数据库并且创建了 users 表。

   6) rails generate controller login

创建 login controller 成功后,将 app/controllers/login_controller.rb 填写为以下内容:

class LoginController < ApplicationController
  def login
	unless request.get?
		username = params[:user][:name]
		password = params[:user][:password]
		@hint = "ok"
		@user = User.find_by_name(username)
		if @user.class == NilClass
		  @hint = 'Unregisted Username!'
		elsif @user.password == params[:user][:password]
		  @hint = "Welcome back, "
		  redirect_to :controller => 'login', :action => 'index'
		else
		  @hint = "Login failed, please check up you info"
		end			
	end
  end

  def index

  end
end

      这里注意下: User.find_by_name 返回一个 User 类对象, 如果使用User.find(:all) 则返回一个数组,出现 nil 错误提示时就要注意你到底选择的是哪一种查询方式了,这两个的 nil 类型是不一样的哦。我就因为没注意到这一点而浪费了很多时间到排错上。

     接下来将 apps/views/login/login.html.erb 填写为以下内容:

<h1>Post#login</h1>
<%= @hint %>  
<% form_for :user, :url => {:action => 'login'} do |f| %>
	<p>
	Username:    <%= f.text_field :name %>
	</p>
	<p>
	Password:    <%= f.password_field :password %>
	</P>
	<%= submit_tag '登陆'%>
	<%= submit_tag '注册'%>
<% end %>
<p>Find me in app/views/post/login.html.erb</p>

     7) rails server

      启动 rails server 后便可以在浏览器中查看登录效果。 这里数据库中还没有任何的记录,所以总是显示 Unregisted username。 可以先手动输入一些记录进行测试查看。因为 rails 采用的是一种 postback 技术,所以会回到自身页面,但我指定了 :url => {:action => 'login'} 所以也是回到目前这个唯一的页面上。

      下次将开发一个注册页面,以配合登录使用。

posted @ 2011-04-25 10:41  rereadyou  阅读(4203)  评论(1编辑  收藏  举报