有时我不需要简单地在我的应用程序中验证smth,还需要在验证之前/之后对其进行更改。即
class Channel < ActiveRecord::Base
validate :validate_url
...
private
def validate_url
url = "rtmp://#{url}" if server_url[0..6] != "rtmp://" #alter cause need this prefix
unless /rtmp://[a-z0-9]{1,3}.pscp.tv:80/[a-z0-9]/[a-z0-9]{1,3}//.match url
errors.add(:url, "...")
end
end
end
或者像这样
class Channel < ActiveRecord::Base
validate :validate_restreams
...
private
def validate_restreams
self.left_restreams = self.left_restreams - self.restreams #to be sure there's no intersections
end
end
但我觉得这不是一个适合做这些事情的地方,所以我需要知道有什么方法可以做到这一点?
您可以为 rails 模型创建自定义验证器。你应该创建一个类,从ActiveModel::Validator
继承它,并在那里定义一个validate(record)
方法,这将向记录添加错误。例如:
这是您的验证器类:
class MyValidator < ActiveModel::Validator
def validate(record)
unless url_valid?(record[:url])
record.errors.add(:url, 'is invalid')
end
end
private
def url_valid?(url)
# validate url and return bool
end
end
现在只需将其添加到模型中:
validates_with MyValidator