我正在尝试为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
吗?
答案 0 :(得分:2)
不要修改验证器中的值;验证者应该在不改变的情况下验证现有数据。
start_with?
方法将普通String
作为参数,而不是Regexp
。
因此,您可以像这样实现验证器:
def website_has_correct_format
errors.add(:website, "Wrong website") unless website.downcase.start_with?('https://', 'http://')
end
答案 1 :(得分:1)
start_with?
returns true
or false
- 给出一个字符串参数。
您还将验证与设置值混为一谈 - 验证是或否;为什么要在验证方法中设置属性值?
答案 2 :(得分:1)
您不应该在验证中修改模型中的数据,因为您有before_save
个动作。验证者应该看:
def website_has_correct_format
errors.add(:website, 'Wrong website') unless website =~ %r{\Ahttps?://}
end