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

新建好项目之后就能够开始写blog了,如今先实现用户的登陆和注册功能。 html

我使用的是sqlite数据库,是rails默认的,因此不用配置,若是使用mysql等的,就要在/config/database.yml中进行配置,具体我就不讲了(由于我也没有配过mysql


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

步骤以下: 数据库

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

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

建好的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中要配好路径 post


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方法) url

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


<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,及说明没有登陆或者注册,就显示登陆和注册,不然显示用户姓名和注销按钮。

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

相关文章
相关标签/搜索