Ruby on Rails学习心得(三)数据库基本操作

新建好项目以后就可以开始写blog了,现在先实现用户的登录和注册功能。

我使用的是sqlite数据库,是rails默认的,所以不用配置,如果使用mysql等的,就要在/config/database.yml中进行配置,具体我就不讲了(因为我也没有配过《Ruby on Rails学习心得(三)数据库基本操作》

首先要新建一个数据表,命名为User,包含字段account(String),password(String),name(String),email(String)

步骤如下:

1、进入项目根目录,使用命令rails g model User account:string password:string name:string email:string,然后会自动仙剑一些文件夹,接着输入rake db:migrate迁移文件。

2、编写保存数据逻辑,我在醒目中新建了一个Users的controller,另外也在之前新建的Home中也加上了一些方法(使用rails g controller命令新建,具体请看上一篇)

建好的controller如下

class HomeController < ApplicationController
  def index
  	
  end
  def login
  end
  def checkLogin
  	
  end
  def logout
  	
  end

end

class UsersController < ApplicationController
  def new
  end
  def create
  end
end

config/routes.rb中要配好路径

MyBlog::Application.routes.draw do
  post "users/create"
  get "users/new"

  get "home/index"
  get "home/login"
  post "home/checkLogin"
  get "home/logout"

  root 'home#index'

end

要确认有对应的view存在,如UsersController的new方法对应这views/users/new.html.erb文件,没有的话就使用重定向(例如:redirect_to :controller=>’home’,:action=>’index’重定向到HomeController的index方法)

在views/home/index.html.erb中写入一下内容

<html>
<head>
	<title>Welcome</title>
	<meta charset='utf8'>
</head>
<body>
	<div>
		<%=link_to '注册',:controller=>'users',:action=>'new' %>
		<%=link_to '登录',:controller=>'home',:action=>'login' %>
	</div>	
</body>
</html>

<%=l ink_to %>是类似与<a></a>的标签,以注册为例转化为html就是<a href=”users/new”>注册</a>

现在先做注册部分,在UsersController的new方法中添加一下内容

def new
  @user = User.new
end

意思是创建一个User类(就是之前创建的model类User)

然后在/views/users/new.html.erb中写入一下内容

<html>
<head>
	<title>注册</title>
	<meta charset = 'utf8'>
</head>
<body>
	<%= form_for(@user,:url=>"/users/create") do |f| %>
		<div class="field">
    		<%= f.label :account %><br>
    		<%= f.text_field :account %>
  		</div>
  		<div class="field">
    		<%= f.label :password %><br>
    		<%= f.text_field :password %>
  		</div>
  		<div class="field">
    		<%= f.label :name %><br>
    		<%= f.text_field :name %>
  		</div>
  		<div class="field">
    		<%= f.label :email %><br>
    		<%= f.text_field :email %>
  		</div>
  		<div class="actions">
    		<%= f.submit %>
  		</div>
	<% end %>
</body>
</html>

注意:由于使用了表单提交数据,所以routes.rb中的create的路径要用post,用rails的form标签,否则会报错。

原理(我自己理解的,如果有错误请指出。。。)

点击注册按钮会定向到UsersController的new方法,在这里会新建一个user,并且传递到new.html.erb中

<%= form_for(@user ,:url=>”/users/create”) do |f| %>应该是用f代替user,提交的数据传递到/users/create中,

<div class="field">
    <%= f.label :account %><br>
    <%= f.text_field :account %>
</div>

转化为html就是

<div class="field">
   <label for="user_account">Account</label><br>
   <input id="user_account" name="user[account]" type="text">
</div>

这样界面就完成了,然后要实现数据保存的逻辑,及/users/ceate,代码如下

def create
  	params.permit!
  	@user = User.new(params[:user])
  	if @user.save
  		session['loginedUser'] = @user
  		redirect_to :controller=>'home',:action=>'index'
  	else
  		redirect_to :controller=>'home',:action=>'registration'
  	end
  end

注意这一句,params.permit!,新版本的rails如果不加上这一句的话会报错的

从new.html.erb中那个传来的数据从新包装成User,保存到数据库中(使用@user.save,会返回boolean),如果成功就保存在session中(session[“loginedUser”]=@user)然后跳转到/home/index,否则跳转到/users/new从新注册

到此,保存部分已经完成了。。。。

然后就是登录部分

页面login.html.erb的代码如下

<html>
<head>
	<title>登录</title>
	<meta charset = 'utf8'>
</head>
<body>
	<%= form_for(:user,:url=>"/home/checkLogin") do |f| %>
		<div class="field">
    		<%= f.label :account %><br>
    		<%= f.text_field :account %>
  		</div>
  		<div class="field">
    		<%= f.label :password %><br>
    		<%= f.text_field :password %>
  		</div>
  		<div class="actions">
    		<%= f.submit %>
  		</div>
	<% end %>
  <%=link_to '返回',:action=>'index',:controller=>'home'%>
</body>
</html>

跟注册的差不多,只是把form_for中的@user改成了:user,url改为”/home/checkLogin”(注意在routes.rb中的对应的路径也要改为post)

登录部分用到的函数是login和checkLogin,代码如下

def login
  end
  def checkLogin
  	@user = User.find_by_account(params[:user][:account])
  	if @user != nil && @user[:password] == params[:user][:password]
  		session['loginedUser'] = @user
  		redirect_to :controller=>'home',:action=>'index'
  	else
  		session['loginedUser'] = nil
  		redirect_to :controller=>'home',:action=>'login'
  	end
  end

由于login只是要跳转到login.html.erb中,所以不用加逻辑

在checkLogin中根据从页面传来的参数查找数据库,根据account来查找user可以使用User.find_by_account(account)来查找,这个rails已经那个封装好了,同样,如果根据name来查找的话就用User.find_by_name(name),如果查找成功就返回(之查找一个)没有就分会nil(注意是nil,不是null)

加入要接受从页面传来的参数,可以使用params[]来获取,例如我要获取user中的account就用params[:user][:account],

登录成功就把user记录到session中并且跳转到/home/index,否则就继续login

到此登录都做好了。。。。

最后就加一点小功能吧,就是动态改变/home/index中的界面(登录前和登录后有两个界面)

先在HomeController中的index方法加上这一句

def index
  	@user = session['loginedUser']
  end

就是从session中取出loginedUser,如果没有就是nil

在logout方法中添加一下内容

def logout
  	session['loginedUser'] = nil
  	redirect_to :controller=>'home',:action=>'index'
  end

清除session

然后是index.html.erb中,修改如下

<html>
<head>
	<title>Welcome</title>
	<meta charset='utf8'>
</head>
<body>
	<div>
		<% if @user==nil %>
			<%=link_to '注册',:controller=>'users',:action=>'new' %>
			<%=link_to '登录',:controller=>'home',:action=>'login' %>
		<% else %>
			<%=link_to @user[:name] %>
			<%=link_to '注销', :controller=>'home',:action=>'logout' %>
		<% end %>
	</div>	
</body>
</html>

页面中用来if来判断,如果@user是nil,及说明没有登录或者注册,就显示登录和注册,否则显示用户姓名和注销按钮。

好了。。。。。。今天到此结束,休息去了!!!!!!!!!!!!!!!!!!!!!!!!

    原文作者:数据库基础
    原文地址: https://my.oschina.net/zlLeaf/blog/150296
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞