作者tonytonyjan (南洋大兜虫)
看板Ruby
标题[问题] Rails Guide 的范例程式码问题
时间Mon Jan 23 00:08:48 2012
撷录自:
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
1F:→ mars90226:虽然跟ActiveRecord不熟,不过应该是因为没有继承吧? 01/23 00:46
2F:→ aquarianboy:因为问题一的Person只是一个一般的Ruby Class 01/23 04:34
3F:→ aquarianboy:它不知道validates_with是在哪边定义的 01/23 04:34
4F:→ 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)