[問題] Rails Guide 的範例程式碼問題

看板Ruby作者 (南洋大兜蟲)時間13年前 (2012/01/23 00:08), 編輯推噓0(004)
留言4則, 2人參與, 最新討論串1/1
擷錄自:http://tinyurl.com/38tjwxr 問題一: class MyValidator < ActiveModel::Validator def validate(record) unless record.name.starts_with? 'X' record.errors[:name] << 'Need a name starting with X please!' end end end class Person include ActiveModel::Validations validates_with MyValidator end 這段程式碼中,為什麼需要 include ActiveModel::Validations? 問題二: class EmailValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i record.errors[attribute] << (options[:message] || "is not an email") end end end class Person < ActiveRecord::Base validates :email, :presence => true, :email => true end 為什麼第二段的用法卻又不用 include 了? 有人有和我一樣的疑惑嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.246.1

01/23 00:46, , 1F
雖然跟ActiveRecord不熟,不過應該是因為沒有繼承吧?
01/23 00:46, 1F

01/23 04:34, , 2F
因為問題一的Person只是一個一般的Ruby Class
01/23 04:34, 2F

01/23 04:34, , 3F
它不知道validates_with是在哪邊定義的
01/23 04:34, 3F

01/23 04:35, , 4F
所以需要特別標示來源 :)
01/23 04:35, 4F
感謝樓上前輩回答=) 話說我另外還找到一篇,我想對一些人也許有幫助: http://tinyurl.com/4x7jbd5 可是我還有一個問題是,為何第二段的用法只需要寫: validates :email, :presence => true, :email => true 就會呼叫到 EmailValidator 的 validate_each? 意思是如果我有其他 attribute ,只要定義一個 class 名叫 AttrNameValidator 就可以了嗎? ※ 編輯: tonytonyjan 來自: 140.113.246.1 (01/23 13:31) 我來自問自答了: 我剛剛看了一下 PresenceValidator 的繼承關係: ActiveModel::Validations::PresenceValidator < ActiveModel::EachValidator 所以我想當我們寫出如下的程式碼時: validates :attr_name, :presence => true Rails 就會去找有沒有 PresenceValidator。 也就是當我寫 validates :attr_name, :abc => ture Rails 就會去找有沒有 AbcValidator 但還不曉得若找不到會發生什麼事情,所以等等來實驗看看。 ※ 編輯: tonytonyjan 來自: 140.113.246.1 (01/23 13:41) 確實擲出了如下的異常: ArgumentError: Unknown validator: 'AbcValidator' ※ 編輯: tonytonyjan 來自: 140.113.246.1 (01/23 13:49)
文章代碼(AID): #1F73ILaX (Ruby)
文章代碼(AID): #1F73ILaX (Ruby)