最近在看railstutorial。
通過rails g model User name:string email:string生成的model隨著教程逐漸變成了以下的德行:
class User < ApplicationRecord
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
#VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
end
這段代碼里的self.email , email 以及 :email分別什么意思,有什么區(qū)別?
如果把 validates :email, ... 改為 validates self.email, ... 后
為什么會(huì)報(bào) NoMethodError: NoMethodError: undefined method 'email'?
before_save { self.email = email.downcase }這里面的 self.email 表示 當(dāng)前對(duì)象 的 email屬性;email.downcase 的 email 表示調(diào)用一個(gè) email 方法(ActiveRecord 自動(dòng)為你生成的);
這行代碼的意思表示:一個(gè) User 實(shí)例對(duì)象在保存之前(before_save),email 轉(zhuǎn)換成小寫;
你的疑問可能是:什么時(shí)候用 self ,什么時(shí)候不用?
答案:絕大多數(shù)情況下都不用 self ,你遇到的這種情況是唯一一種需要顯示使用 self 的情況。
validates :email, ... 改為 validates self.email, ...后validates 是一個(gè) 類宏(class macro),類宏中的 self 表示當(dāng)前類對(duì)象本身(User),當(dāng)前類 User 對(duì)象(類對(duì)象本身)并沒有 email 方法(當(dāng)前類 User 有一個(gè)實(shí)例方法 email,是 ActiveRecord 為你生成的,上面解釋過了),所以報(bào)錯(cuò);
這行代碼的意思是:一個(gè) User 實(shí)例對(duì)象 save 或者 update 之前,需要驗(yàn)證 email 屬性;如果改成了 validates self.email, ... ,就代表驗(yàn)證 User 類對(duì)象本身的 email 方法,由于 User 類對(duì)象本身并沒有 email 方法,所以 NoMethodError。
PS:建議研讀下 《Ruby 元編程》(中文版第二版早已經(jīng)出版了),就會(huì)對(duì) ruby 這些本質(zhì)的東西有一個(gè)更透徹的理解;如果覺得 Ruby 中好多的方法都不知道怎么用,DHH 推薦的 《The Ruby Way: Solutions and Techniques in Ruby Programming》也是一本高大全的書;鎬頭書《Programming Ruby》和 David Flanagan 的《The Ruby Programming Language》也是兩本非常好的 ruby 全解(盡管這兩本已經(jīng)有些過時(shí),但對(duì)你沒影響);
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。