2017-04-01 5 views
0

Manchmal muss ich nicht einfach smth in meiner App validieren, sondern auch vor/nach der Validierung ändern. I.e.Wo kann die Validierung geändert werden?

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 

oder smth wie dies

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 

Aber ich glaube, es ist kein richtiger Ort für solche Dinge, so muß ich wissen, was ist der Weg, um es richtig zu machen?

Antwort

0

Sie können einen benutzerdefinierten Validator für ein Schienenmodell erstellen. Sie sollten eine Klasse erstellen, sie von ActiveModel::Validator erben und dort eine validate(record) Methode definieren, die dem Datensatz Fehler hinzufügt. Zum Beispiel:

Das ist Ihre Validator-Klasse:

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 

Und jetzt einfach fügen Sie diese zum Modell:

validates_with MyValidator 
+0

Oh, das ist nicht die Antwort, die ich zu erhalten erwartet. Ich meine, den Wert zu ändern ist nicht das, was man normalerweise vom Validator erwartet, oder? Vielleicht gibt es einen anderen Weg, das Gleiche zu tun? – Ngoral

Verwandte Themen