在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Ruby  網(wǎng)絡(luò)安全/ Ruby on Rails的model有email屬性,那么self.email

Ruby on Rails的model有email屬性,那么self.email :email和email有什么區(qū)別?

最近在看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.downcaseemail 表示調(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ì)你沒影響);

2017年3月20日 08:53