2017-04-01 41 views
0

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

您可以为导轨模型创建自定义验证器。您应该创建一个课程,从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 
+0

哦,这不是我希望得到答案。我的意思是改变价值不是你通常期望从验证者那里得到的,对吗?所以,也许还有另一种方法可以做到这一点?.. – Ngoral