改变验证的地方在哪里?

时间:2017-04-01 11:49:01

标签: ruby-on-rails model-view-controller

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

但我觉得这不适合做这些事情,所以我需要知道做对的方法是什么?

1 个答案:

答案 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