新建好項目之後就能夠開始寫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,及說明沒有登陸或者註冊,就顯示登陸和註冊,不然顯示用戶姓名和註銷按鈕。
好了。。。。。。今天到此結束,休息去了!!!!!!!!!!!!!!!!!!!!!!!!