看板 Ruby 關於我們 聯絡資訊
擷錄自: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
mars90226:雖然跟ActiveRecord不熟,不過應該是因為沒有繼承吧? 01/23 00:46
aquarianboy:因為問題一的Person只是一個一般的Ruby Class 01/23 04:34
aquarianboy:它不知道validates_with是在哪邊定義的 01/23 04:34
aquarianboy:所以需要特別標示來源 :) 01/23 04:35
感謝樓上前輩回答=) 話說我另外還找到一篇,我想對一些人也許有幫助: 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)