Rubyonrails登陸注冊(cè)郵箱驗(yàn)證功能_第1頁(yè)
Rubyonrails登陸注冊(cè)郵箱驗(yàn)證功能_第2頁(yè)
Rubyonrails登陸注冊(cè)郵箱驗(yàn)證功能_第3頁(yè)
Rubyonrails登陸注冊(cè)郵箱驗(yàn)證功能_第4頁(yè)
Rubyonrails登陸注冊(cè)郵箱驗(yàn)證功能_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、首頁(yè) 資訊 精華 論壇 問(wèn)答 博客 專欄 群組 更多 您還未登錄 ! 登錄 注冊(cè)紅寶石· 博客· 微博· 相冊(cè)· 收藏· 留言· 關(guān)于我窗體頂端 窗體底端Ruby on Rails注冊(cè)激活系統(tǒng)博客分類: · ruby on railsRuby on Rails注冊(cè)激活系統(tǒng) rails ruby ruby on rails敏捷開(kāi)發(fā)最佳實(shí)踐 

2、李剛 rails的郵件抽象層 注冊(cè)激活系統(tǒng)        現(xiàn)在好像Ruby on Rails越來(lái)越流行了,我也開(kāi)始研究一下這門(mén)新興的熱門(mén)技術(shù)。今天剛看到網(wǎng)上推薦了一本新書(shū)Ruby on Rails敏捷開(kāi)發(fā)最佳實(shí)踐,第一作者就是頗受好評(píng)的struts2權(quán)威指南的作者李剛,而第二作者據(jù)說(shuō)是位在外企工作很有ror經(jīng)驗(yàn)的人士。我讀了一下試讀部分,果然清晰易懂,又講解得十分透徹,而所舉的例子也非常實(shí)用。     &#

3、160;   下面,我摘錄了書(shū)中關(guān)于“注冊(cè)激活系統(tǒng)”的部分,是Rails的郵件抽象層中的內(nèi)容。這個(gè)例子對(duì)于以后做通過(guò)郵件來(lái)激活注冊(cè)這樣的項(xiàng)目時(shí),就能派上用場(chǎng)了。(1) 基本注冊(cè)功能當(dāng)用戶注冊(cè)一個(gè)賬戶時(shí),實(shí)際上就等同于向底層數(shù)據(jù)表增加一條記錄,因此本應(yīng)用必須有持久層支持。本示例應(yīng)用的注冊(cè)功能需要一個(gè)數(shù)據(jù)表支持,該數(shù)據(jù)表用于保存系統(tǒng)的所有注冊(cè)賬戶。下面是本應(yīng)用的數(shù)據(jù)庫(kù)腳本:Sql代碼  1 drop database if exists regist_development; &

4、#160; 2   3 create database regist_development;   4   5 use regist_development;   6   7 -創(chuàng)建用戶表  8   9 create table users (   10

5、60;  11     id int not null auto_increment,   12   13     name varchar(100) not null unique,   14   15     pass

6、0;varchar(100) not null,   16   17     email varchar(150) not null,   18   19     active_code varchar(255),   20   21  &

7、#160;  is_activated boolean,     22   23     primary key (id)   24   25 );  上面創(chuàng)建了一個(gè)users數(shù)據(jù)表,該數(shù)據(jù)表里保存了用戶名、密碼、E-mail、激活碼和是否激活等5個(gè)數(shù)據(jù)列。前三個(gè)數(shù)據(jù)列的作用非常清晰,此處不再贅述。激活碼列用于保存用戶剛剛注冊(cè)時(shí)

8、系統(tǒng)生成的注冊(cè)碼,這個(gè)注冊(cè)碼將通過(guò)郵件發(fā)送給用戶,系統(tǒng)正是通過(guò)比較用戶輸入的注冊(cè)碼和這個(gè)注冊(cè)碼是否相等,從而決定是否可以激活用戶。上面的users數(shù)據(jù)表對(duì)應(yīng)的持久化類是User,這個(gè)持久化類的代碼非常簡(jiǎn)單,只是增加了一些Model校驗(yàn)功能。下面是User類的代碼:Ruby代碼  26 class User < ActiveRecord:Base   27   28     def validate &

9、#160; 29   30         #驗(yàn)證name不能為空      31   32         errors.add("", "用戶名只能是字母、數(shù)字或下劃線,且長(zhǎng)度必須為4到20位")   33

10、   34             unless name= /w4,20$/   35   36         #驗(yàn)證name不能是一個(gè)數(shù)據(jù)庫(kù)中已經(jīng)存在的名字   37   38  &#

11、160;      errors.add("", "用戶名不能重復(fù),您選擇的用戶名已經(jīng)存在")   39   40             unless User.find_by_name(name).nil?   41   42

12、         #驗(yàn)證password不能為空   43   44         errors.add("", "密碼只能是字母或數(shù)字,且長(zhǎng)度必須為4到20位")    45   46    &#

13、160;        unless pass = /a-zA-Z0-94,20$/   47   48         #驗(yàn)證e-mail規(guī)則   49   50         erro

14、rs.add("", "電子郵件必須匹配電子郵件規(guī)則")   51   52             unless email = /w+w+.a-zA-Z2,6$/   53   54     end 

15、60;55   56 end  提供了上面的User Model之后,處理用戶注冊(cè)就非常簡(jiǎn)單了,只需要提供一個(gè)注冊(cè)表單,這個(gè)表單里包含用戶注冊(cè)的基本信息即可。下面是用戶注冊(cè)的表單頁(yè)代碼:Ruby代碼  57 <b>請(qǐng)輸入您的注冊(cè)信息</b><br>   58   59 <b>注意:請(qǐng)務(wù)必輸入有效的郵箱用于接收激活郵件</b><br>  

16、 60   61 <%= error_messages_for :user %>   62   63 <% form_for :user, user, :url =>  :action => "pro_regist"  do |f| %>  &

17、#160;64   65 用戶名:<%= f.text_field :name %><br/>   66   67 密 碼:<%= f.password_field :pass %><br/>   68   69 Email:<%= f.text_field :email&#

18、160;%><br/>   70   71 <%= submit_tag("注冊(cè)")%>   72   73 <% end %>  當(dāng)用戶單擊“注冊(cè)”按鈕時(shí),將會(huì)把表單提交到pro_regist Action。這個(gè)Action也非常簡(jiǎn)單,它只需調(diào)用該User類的create方法向users數(shù)據(jù)表中增加一條記錄即可。下面是處理用戶注冊(cè)的A

19、ction代碼:Ruby代碼  74 # 處理用戶登錄  75   76 def pro_regist   77   78     #創(chuàng)建一個(gè)新的user對(duì)象  79   80     user = User.new(params:user) 

20、60; 81   82     # 以當(dāng)前時(shí)間來(lái)隨機(jī)生成激活碼  83   84     user.active_code = rand(Time.now.to_i).to_s   85   86     # 設(shè)置用戶開(kāi)始處于未激活狀態(tài)  

21、87   88     user.is_activated = false  89   90     #如果user對(duì)象能成功地保存進(jìn)數(shù)據(jù)庫(kù)  91   92     if user.save then  93   94 

22、;        flash:notice = '您已經(jīng)注冊(cè)成功'  95   96         flash:name =    97   98        &

23、#160;# 發(fā)送郵件  99   100         ActivateMail.deliver_sent(user)   101   102         redirect_to :action => 'success' 

24、0;103   104     # 保存失敗  105   106     else  107   108         render :action => 'index'  109 &

25、#160; 110     end  111   112 end  上面的Action方法的實(shí)現(xiàn)與普通注冊(cè)Action代碼大致相似,不同的是上面的Action代碼需要調(diào)用ActivateMail.deliver_sent(user)代碼來(lái)發(fā)送郵件。這行代碼調(diào)用ActivateMail Model里的sent方法來(lái)發(fā)送激活郵件,這也就是本應(yīng)用實(shí)現(xiàn)用戶激活的重點(diǎn)。(2) 發(fā)送激活郵件本應(yīng)用需要向注冊(cè)用戶發(fā)送激活郵件,對(duì)于Rails應(yīng)用而言,

26、激活郵件也就是一封最普通的郵件,因此我們像開(kāi)發(fā)普通郵件模塊一樣來(lái)實(shí)現(xiàn)發(fā)送激活郵件。同樣,我們先使用Rails提供的郵件代碼生成器來(lái)生成一個(gè)郵件模塊。進(jìn)入Rails應(yīng)用的根路徑下,輸入如下命令:# 生成ActivateMail郵件Model,并提供一個(gè)sent方法ruby script/generate mail ActivateMail sent上面的代碼生成器命令會(huì)在app/models路徑下生成一個(gè)activate_mail.rb文件,這個(gè)文件就是郵件發(fā)送Model,該Model里定義了一個(gè)sent方法,該方法就是發(fā)送郵件的業(yè)務(wù)邏輯方法。修

27、改上面的sent方法,讓該sent方法實(shí)現(xiàn)發(fā)送激活郵件的功能。修改后的sent方法代碼如下:Ruby代碼  113 # 定義發(fā)送郵件的業(yè)務(wù)方法  114   115 def sent(user)   116   117     # 指定郵件標(biāo)題  118   119    

28、60;subject    = '激活郵件'  120   121     # 將新注冊(cè)的User實(shí)例傳給郵件內(nèi)容模板  122   123     body       = 'user'=>user  

29、; 124   125     # 使用用戶的注冊(cè)郵件作為收件人地址  126   127     recipients = user.email   128   129     # 使用spring_test作為發(fā)件人地址  130

30、60;  131     from       = 'spring_test'  132   133     sent_on    = Time.now   134   135    

31、 headers    =    136   137     # 指定使用HTML格式的郵件  138   139     content_type = 'text/html'  140   141 end 

32、60;與前面完全類似的是,我們一樣采用spring_test作為發(fā)件人地址,這就要求我們必須在config路徑下的environment.rb文件中配置sina的郵件服務(wù)器。在environment.rb文件中增加如下代碼:Ruby代碼  142 ActionMailer:Base.delivery_method = :smtp  143   144 ActionMailer:Base.server_settings =    

33、0;145   146     :address => '',   147   148     :port => 25,   149   150     :domain => '',

34、0;  151   152     :user_name => 'spring_test',   153   154     :password => '123456',   155   156    &#

35、160;:authentication => :login    157   158 ActionMailer:Base.default_charset  = 'GBK'  經(jīng)過(guò)上面步驟,我們已經(jīng)實(shí)現(xiàn)了發(fā)送激活郵件的大部分功能。還有一個(gè)必須完成的地方:我們定義sent(user)方法時(shí),該方法為body賦值的是一個(gè)Hash對(duì)象,這意味著我們還需要為該方法指定一個(gè)郵件模板。當(dāng)我們執(zhí)行ruby script/gener

36、ate mail ActivateMail sent命令時(shí),該命令還在appviewsactivate_mail路徑下生成了一個(gè)sent.rhtml文件,這個(gè)模板文件的響應(yīng)將作為ActivateMail.sent(user)方法發(fā)送的郵件內(nèi)容。sent.rhtml模板文件的代碼如下:Ruby代碼  159 <h4><%= %>,您好!</h4>   160   161 請(qǐng)?jiān)跒g覽器的地址欄中輸入如下地址來(lái)

37、激活您的賬戶:<br/>   162   163 <a href='http:/localhost:3000/regist/pro_activate?name=<%= %>&active_code=   164   165     <%= user.active_code%>'> 

38、0; 166   167 http:/localhost:3000/regist/pro_activate?name=<%= %>&active_code=   168   169     <%= user.active_code%>   170   171 </a> 

39、0;上面的郵件模板是一個(gè)非常簡(jiǎn)單的頁(yè)面,這個(gè)頁(yè)面包含了一個(gè)簡(jiǎn)單的超級(jí)鏈接,這個(gè)超級(jí)鏈接將向服務(wù)器發(fā)送兩個(gè)請(qǐng)求參數(shù):用戶名和驗(yàn)證碼。用戶只要單擊賬戶激活鏈接,就可以激活剛剛注冊(cè)的賬戶。在還未激活用戶賬戶之前,我們打開(kāi)users數(shù)據(jù)表,看到用戶剛剛注冊(cè)的賬戶信息處于未激活狀態(tài)。當(dāng)用戶賬戶被激活后,is_activated列的值將變成1,這表明用戶賬戶已被激活。(3) 處理激活用戶單擊激活郵件中的鏈接,相當(dāng)于向系統(tǒng)的regist控制器的pro_activate Action發(fā)送一個(gè)請(qǐng)求,并將用戶名和激活碼作為請(qǐng)求參數(shù),Rails應(yīng)用將根據(jù)這兩個(gè)請(qǐng)求參數(shù)來(lái)決定是否激活用戶賬戶。下面

40、是pro_activate Action的代碼:Ruby代碼  172 # 處理用戶激活  173   174 def pro_activate   175   176     user = User.find_by_name(params:name)   177   178 &

41、#160;   # 如果用戶不為空,且用戶處于未激活狀態(tài),且用戶輸入的激活碼正確  179   180     if user != nil && user.is_activated = false && user.active_code = params:active_code then 

42、60;181   182         # 修改激活狀態(tài)  183   184         user.update_attribute(:is_activated , true)   185   186   

43、60;     flash:notice = "恭喜您,您已經(jīng)成功激活了您的賬戶!"  187   188     # 如果用戶已經(jīng)處于激活狀態(tài)  189   190     elsif user != nil && user.is_

44、activated = true then  191   192         flash:notice = "您的賬戶已經(jīng)處于激活狀態(tài),請(qǐng)勿重復(fù)激活!"  193   194     else  195   196  

45、;       flash:notice = "激活失??!"  197   198     end  199   200     redirect_to :action=>'activate_result'  201   202 end  上面Action先根據(jù)發(fā)送的name請(qǐng)求參數(shù)取出users表中對(duì)應(yīng)的用戶賬戶,然后判斷取出的賬戶里包含的激活碼與用戶請(qǐng)求中包含的激活碼請(qǐng)求參數(shù)是否相同。如果兩個(gè)激活碼相同,而且用戶還未激活,系統(tǒng)將把用戶賬戶的is_activated屬性修改為true,即完成用戶激活。如果用戶的is_activated狀態(tài)已經(jīng)是true,則提醒用戶不用重復(fù)激活賬戶。當(dāng)用戶注冊(cè)成功,并且通過(guò)激活鏈接來(lái)激活賬戶后,也就是將users數(shù)據(jù)表中對(duì)應(yīng)記錄行的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論