2012-07-30 3 views
5

Sommario: Sto cercando di alterare il valore di un attributo all'interno una consuetudine ActiveModel::EachValidator validatore. Dato il seguente prototipo:cambiare o aggiornare un valore di attributo durante la validazione Rails ActiveRecord

def validate_each(record, attribute, value)

cercando di impostare value = thing non sembra di fare nulla - mi sto perdendo qualcosa? Ci dovrebbe essere un modo intelligente per farlo ...

Dettagli: Accetto un input URL come parte di un sito. Non voglio solo prendere l'URL e convalidare direttamente che restituisce un messaggio 200 OK, poiché ciò ignorerebbe le voci che non iniziavano con http, o lasciavano fuori il leader www, ecc. Ho qualche logica personalizzata da gestire quegli errori e seguire i reindirizzamenti. Pertanto, mi piacerebbe che la convalida a succeda a se un utente digita example.org/article anziché http://www.example.org/article. La logica funziona correttamente all'interno della convalida, ma il problema è che se qualcuno inserisce il primo, il valore memorizzato nel database è nella forma "errata" piuttosto che quella ben aggiornata. Posso modificare la voce durante la convalida in una forma più canonica?

+0

+1 per fare una buona domanda – neeraj

risposta

11

È necessario lasciare la convalida per fare proprio questo: convalidare; non è il posto giusto per manipolare gli attributi del tuo modello.

Vedere la chiamata di ActiveModel before_validation. Questo è un luogo più appropriato per manipolare gli attributi del modello in preparazione alla convalida.

Sembra che tu debba dire all'implementazione ActiveModel di callback, almeno secondo this SO question.

class YourModel 
    extend ActiveModel::Callbacks 
    include ActiveModel::Validations 
    include ActiveModel::Validations::Callbacks 

    before_validation :manipulate_attributes 

    def manipulate_attributes 
    # Your manipulation here. 
    end 
end 
+0

Buona chiamata: non provare a cambiare le cose durante la convalida. Grazie all'aggiunta di un codice in prima_validazione, grazie! – aardvarkk

+0

+1 per dare una buona soluzione come stavo cercando lo stesso. – neeraj