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,及說明沒有登陸或者註冊,就顯示登陸和註冊,不然顯示用戶姓名和註銷按鈕。

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

相關文章
相關標籤/搜索