有时我不需要在我的应用程序中简单地验证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
但我觉得这不适合做这些事情,所以我需要知道做对的方法是什么?
答案 0 :(得分:0)
您可以为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