[問題] Rails Guide 的範例程式碼問題
擷錄自: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
01/23 00:46, 1F
→
01/23 04:34, , 2F
01/23 04:34, 2F
→
01/23 04:34, , 3F
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)
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章