




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)擔(dān)保個(gè)合同范例
- 個(gè)人委托拆遷合同范例
- 公司還款延期合同范例
- 公司高層崗位勞動(dòng)合同范例
- 兄弟之間合租合同范例
- 一季度付房租合同范例
- 公司墊付款合同范例
- 上海預(yù)售合同范例
- 債權(quán)投資合同范例
- 院校紡織機(jī)械課程考題及答案
- 馬克思主義基本原理智慧樹(shù)知到課后章節(jié)答案2023年下湖南大學(xué)
- 第七講-信息技術(shù)與大數(shù)據(jù)倫理問(wèn)題-副本
- (完整版)數(shù)字信號(hào)處理教案(東南大學(xué))
- 公園EPC建設(shè)項(xiàng)目合同管理的監(jiān)理措施
- 祖暅原理的課件
- 保密警示教育課件
- 《神經(jīng)系統(tǒng)的傳導(dǎo)通路》課件
- 滬科版八年級(jí)全一冊(cè)《空氣的“力量”》教案及教學(xué)反思
- 青海省魚(yú)卡礦區(qū)魚(yú)卡二號(hào)井礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- 提高大面積混凝土地面表面平整度課件
- 活動(dòng)板房材料規(guī)格表大全
評(píng)論
0/150
提交評(píng)論