我正在尝试为我的store.website
编写自定义验证。我希望该方法检查网站字段是以http://
还是https://
开头。这是我尝试过的:
class Store < ActiveRecord::Base
validate :website_has_correct_format
def website_has_correct_format
self.website = self.website.downcase.start_with?(/https?:///, '')
end
end
不过这行不通。出于某种奇怪的原因,它实际上只是将字母保存t
.
正确的方法是什么?另外,我也可以给它:message
吗?
-
不要修改验证器中的值;验证器应验证现有数据而不更改它。
-
start_with?
方法将普通String
作为参数,而不是Regexp
。
因此,您可以像这样实现验证器:
def website_has_correct_format
errors.add(:website, "Wrong website") unless website.downcase.start_with?('https://', 'http://')
end
start_with?
返回 true
或 false
--给定一个字符串参数。
您还将验证与设置值混为一谈 - 验证是或否;为什么要在验证方法中设置属性值?
您不应该在验证中修改模型中的数据,为此您有before_save
操作。验证人应该看:
def website_has_correct_format
errors.add(:website, 'Wrong website') unless website =~ %r{Ahttps?://}
end