11--Rails数据交互3
目前我們已經(jīng)完成了微博應用的用戶模型最基本的開發(fā),但是使用這個用戶模型是通過控制臺很不方便,這節(jié)課就來為微博應用添加用戶登錄和注冊的可視化功能,講解rails中會話的概念和使用。
用戶是需要密碼的,我們先給用戶模型添加上密碼字段,只要兩個步驟:
第一個步驟就是給用戶模型再添加一個字段叫password
第一步比較麻煩,要退出rails控制臺,如下操作
完成后會自動創(chuàng)建如下文件
添加代碼后如下:
代碼的意思就是為users模型添加一個password字段。
還沒完,別忘了數(shù)據(jù)庫遷移的工作rake db:migrate即可:
?
?
第二個步驟就是在User模型里添加安全密碼has_secure_password這么一個方法 第三步驟就是為password字段加上基本驗證。?
上節(jié)課我們添加新用戶是通過控制臺,實際上應該有頁面來注冊用戶,注冊的用戶來使用網(wǎng)站的服務。根據(jù)前面所學,我們創(chuàng)建新用戶的路由需要使用Users控制器的new這個action。我們可以首先創(chuàng)建Users控制器,因為我們只創(chuàng)建一個模型而已。
IDE中打開控制器文件:
先在瀏覽器訪問new這個action試試(要是不顯示網(wǎng)頁就是沒運行服務器rails server,因為錯誤會出現(xiàn)錯誤的紅白頁面才對)
我們能訪問到new這個action,因為生成控制器同時生成了它的視圖,但是我們還沒為它添加任何功能。
打開路由我們把下面自動生成的路由刪除
改成資源路由如下第二行:
既然是注冊頁面,那么很明了:一個填寫表單信息的頁面,該頁面有一個提交按鈕。
我們打開new這個視圖:
會報錯,因為寫完視圖代碼,還需要去new動作添加一段代碼,代碼就是為了給前端的表單提供變量支持:
該視圖代碼我們只要知道點擊注冊會將用戶名、郵箱和密碼這三組信息發(fā)送到我們的user控制器對應的create這么一個action動作就可以了。
還有前面添加的字段出錯了正確如下,要加上_digest:?
下面開始就用git來操作,不用win+R的cmd窗口了,如下直接打開工程目錄報錯,也許目錄沒問題,我們一級一級進入工程目錄就可以:
我們輸入一組信息試試點擊注冊試試:
結果如下:
報錯是因為表單提交時提交給user控制器的create這個action進行內容的創(chuàng)建,但是我們的user控制器現(xiàn)在還沒有create動作,
所以下面我們加入健壯參數(shù),我們只要知道健壯參數(shù)可以限制只提交特定幾個字段而其他字段不允許提交就行,還有前面有錯,user前面有@,正確代碼如下:
這時候回到new視圖
那么可以看到是password字段出問題,這個字段是后來添加上的,可能的原因是我們添加沒成功,所以我們刪除如下截圖的第三個文件
然后命令行輸入rails g migration AddPasswordDigestToUsers:
重新生成上面的刪除文件,添加完代碼如下:
然后再執(zhí)行
這時候重進new頁面點擊提交就可以了,如下:
還有我們前面的new視圖代碼少了一行<%=f.password_field :password %>,補充后如下:這時在重新注冊提交,結果如下,密碼標簽下面就有了密碼輸入框:
如上,我們提交完的結果是又回到了注冊頁的頁面上,這個就是下面代碼的作用
字段標紅,是因為我們添加了驗證,驗證不通過就標紅。
但是這樣給用戶的體驗是非常差的,因為沒有給出哪里錯誤的提示,用戶還會繼續(xù)輸入錯誤,那么我們就來添加錯誤提示信息:
之前我們就在控制臺用過,當save失敗,錯誤信息會保存到errors.full_messages這個字段中在new視圖添加錯誤提示的代碼3到14行
刷新new頁面后,用戶名不填,后面隨便填寫些數(shù)字,密碼和密碼確認沒填寫一致,結果如下
用戶名不能為空,email格式不合法,密碼和密碼確認不一致,密碼太短
注冊失敗的代碼寫完之后,我們下面完成注冊成功的代碼的編寫,這里我們假設用戶注冊成功之后就會進入顯示用戶的個人資料頁面(這個顯示其實就是這種路由頁面,users/id):
所以我們就在控制器的save成功里面添加跳轉的代碼,第10行
這樣還不行,因為我們還沒有添加用戶個人資料頁,添加也很簡單
首先在user控制器中添加show這個action,里面代碼也很簡單就是根據(jù)路由傳來的id(它保存到params里面),我們根據(jù)id查找并保存到變量@user里面。第16到第18行。
然后去新建users文件夾下的show頁面并添加代碼:
這時候我們刷新new頁面并依次輸入sundi,123@123.com,1234567,1234567
結果好像輸入的沒有在頁面正常顯示,原來是頁面代碼寫錯了,<%后面沒寫=,修改后如下(跟br沒關系,br是換行):
這時候就表明我們的注冊功能能夠正常地運行了,有了注冊功能下面我們還需要一個登陸功能,實現(xiàn)登陸功能就涉及到本節(jié)課的一個重點"會話":
我們在登陸一個網(wǎng)站以后,不退出網(wǎng)站的情況下默認都是登陸這個賬號的,所以后面可以訪問任何頁面而不用再次登陸。其實這樣就是會話保持的這么一種技術,那么什么是會話呢?我們可以理解為是用戶瀏覽器和rails服務之間的關系的一種保持,保持的就是一些用戶的登陸狀態(tài)和用戶的瀏覽信息等等。
那么rails是怎么實現(xiàn)會話功能的呢?
Rails常用的方法就是使用session來實現(xiàn)會話,rails本身提供了一套session的方法讓用戶可以直接去調用。
?
Session:在計算機中,尤其是在網(wǎng)絡應用中,稱為"會話控制"。Session 對象存儲特定用戶會話所需的信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web 頁時,如果該用戶還沒有會話,則 Web 服務器將自動創(chuàng)建一個 Session 對象。當會話過期或被放棄后,服務器將終止該會話。Session 對象最常見的一個用法就是存儲用戶的首選項。例如,如果用戶指明不喜歡查看圖形,就可以將該信息存儲在 Session 對象中。有關使用 Session 對象的詳細信息,請參閱"ASP 應用程序"部分的"管理會話"。注意 會話狀態(tài)僅在支持 cookie 的瀏覽器中保留。
?
那么我們現(xiàn)在知道了session這個概念,我們就去實現(xiàn)一個會話功能,先添加一個會話控制器并在里面添加一個動作叫做new:
之后我們再去添加路由信息:
先把第二行代碼的路由刪除
添加三個路由,分別是new、create和destroy動作,代碼第5第6第7行:
new動作向用戶顯示登陸的頁面(就跟注冊里面的new動作一樣),create用來創(chuàng)建一個新的會話(它相當于注冊里面注冊用戶的那個create),destroy就是用來銷毀或者刪除用戶登錄的會話也就是我們平常所說的退出會話。
完成這部分之后,我們還要一個登陸頁面,如下是自動生成的new視圖:
更改為,代碼意思就是給用戶提供一個登陸表單,當用戶點擊登陸按鈕以后就可以將登陸信息提交到create這個動作中(這個我們前面就在注冊頁面見過了,很方便),我們只要知道這是用來顯示登陸框填入信息點擊提交就會將輸入信息提交到后端:
接下來我們打開sessions這個控制器:
在里面添加一個動作叫create,首先我們要登陸最基本就是先查找存不存在這一個用戶,如果存在還要去驗證這個密碼正不正確,查找用戶我們使用find_by對email這個字段進行查找,并且我們在查找之前將用戶輸入的那些字段強制轉換為小寫。
(email:params[:session][:email].downcase),前面是數(shù)據(jù)庫中的email,后面是用戶的輸入對應params里保存的session參數(shù)的該參數(shù)里面的[:email]字段然后就是判斷用戶存在不存在并且判斷密碼正確不正確
session[:user_id]=@user.id #這句話其實就是將當前用的的@user.id保存到session變量的:user_id字段中,只要我們不去銷毀或者置空這個值,那么這個值就會在整個rails的生命周期中一直存在。這個就可以作為會話狀態(tài)的憑證,我們驗證是不是有這個值存在就知道當前有沒有會話登陸狀態(tài)在保持,進而通過user_id就可以判斷當前用戶是不是登陸。
當我們有了用戶登錄這個方法,我們其實可以在用戶注冊完成以后直接讓用戶登錄。怎么做呢?其實很簡單,在用戶控制器的注冊方法后面也添加這么一行代碼就行,如下圖的第10行代碼。就是就是將當前用的的@user.id保存到session變量的:user_id字段中就可以記住用戶的登陸狀態(tài)了。
最后我們要做的就是完成退出的功能,退出其實很簡單就是將session置空就行了,到session的控制器添加一個destroy方法如下:
delete和[]沒空格隔開則
我們還需要在頁面上添加退出按鈕,比如我們添加到個人資料頁,如下
我們直接進入login頁面并輸入如下:
點擊登陸:
還有注意find_by和后面的(不能有空格,否則如下:
其實這些問題很簡單,視頻里錯誤,正確如下:
find_by前面要加User.
還有驗證的英語是authenticate,視頻里寫錯了
前面的錯誤可以通過查看文檔來發(fā)現(xiàn),文檔地址http://doc.rubyfans.com/
進入網(wǎng)址后點擊Rails的v4.1.0,左上角輸入方法名,右邊就是使用案例,可以知道我們需要在我們的代碼find_by前面加上User
這樣第一個錯誤就解決了,但是還是報錯
?
然后我們文檔查找發(fā)現(xiàn)沒有找到這個方法(rails的方法,ruby而非rails的方法自可能找不到,但這里我們已經(jīng)知道要找的方法就是rails的方法,但還是沒找到就知道是我們方法名拼寫錯誤),而驗證的英語是authenticate,所以我們拼寫錯誤,我們文檔找該方法試試,就能查找到該方法因為是登陸驗證所以我們就點擊這第一個的on GitHub(沒有像前面一樣簡短的使用案例,因為驗證需要上下文,所以我們可以點擊進入GitHub里面查看該方法的定義使用形式)正確代碼如下:
我們輸入前面注冊的用戶信息點擊登陸就能正確顯示如下頁面
到此說明我們登陸成功了。這時候我們點擊上面的Log out鏈接進行退出,就回到如下頁面重新登陸:
還有個注意事項,前面的如下應該是session.delete(:user_id)括號不是[],不然會報錯如下(但是我們delete與后面的[有個空格隔開就能不報錯,這個是自己發(fā)現(xiàn)的,先記住吧):
?
到此點擊Log out能跳回登陸的頁面,說明我們成功退出,銷毀了登陸的會話。
但這里問題其實還非常多,比如哈希驗證沒有涉及,代碼還可以寫得更簡潔等等。
轉載于:https://www.cnblogs.com/blueColdFire/p/5199096.html
總結
以上是生活随笔為你收集整理的11--Rails数据交互3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios NSFileManager 用法
- 下一篇: 3.5 mysql备份与恢复