更改验证的地方在哪里



有时我不需要简单地在我的应用程序中验证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

最新更新