7

Ho un'app Rails 3.2.18 in cui sto provando a eseguire alcune convalide condizionali su un modello.Convalida condizionale delle rotaie nel modello

Nel modello di chiamata ci sono due campi: location_id (che è un'associazione a un elenco di posizioni predefinite) e: location_other (che è un campo di testo in cui qualcuno potrebbe digitare una stringa o in questo caso un indirizzo).

Quello che voglio essere in grado di fare è utilizzare le convalide quando si crea una chiamata a dove sia: location_id o: location_other è convalidato per essere presente.

Ho letto la guida di convalida di Rails e sono un po 'confuso. Speravo che qualcuno potesse far luce su come farlo facilmente con un condizionale.

+1

Non capisco la domanda principale. Riguarda come usare le opzioni 'if' e' unless' delle macro valdate? O si tratta di come convalidare solo su determinati attributi del modello quando si salva un modello da alcune azioni del controller (e non da altri)? – pdobb

+0

Ci scusiamo per la confusione. Sto cercando di capire come usare if e unless quando si crea/salva un record. L'obiettivo finale è verificare che sia: location_id o: location_other sia impostato quando si crea/salva un record. Non sono sicuro di come farlo. – nulltek

risposta

14

Credo che questo è ciò che stai cercando:

class Call < ActiveRecord::Base 
    validate :location_id_or_other 

    def location_id_or_other 
    if location_id.blank? && location_other.blank? 
     errors.add(:location_other, 'needs to be present if location_id is not present') 
    end 
    end 
end 

location_id_or_other è un metodo di validazione personalizzato che controlla se location_id e location_other sono vuote. Se lo sono entrambi, aggiunge un errore di convalida. Se la presenza di location_id e location_other è un esclusivo o, ad esempio solo uno dei due può essere presente, né uno né l'uno né l'altro, è possibile apportare le seguenti modifiche al blocco if nel metodo.

if location_id.blank? == location_other.blank? 
    errors.add(:location_other, "must be present if location_id isn't, but can't be present if location_id is") 
end 

soluzione alternativa

class Call < ActiveRecord::Base 
    validates :location_id, presence: true, unless: :location_other 
    validates :location_other, presence: true, unless: :location_id 
end 

Questa soluzione (solo) funziona se la presenza di location_id e location_other è un esclusivo o.

Per ulteriori informazioni, consultare Rails Validation Guide.

+1

Grazie per la rapida risposta. La prima soluzione, la creazione di una convalida personalizzata ha fatto il trucco. Stavo solo facendo delle ricerche sulle convalide personalizzate e ho iniziato a scrivere qualcosa di simile, grazie per avermi risparmiato tempo e insegnarmi. Lo apprezzo! – nulltek

+0

Nessun problema! E controlla la [Rails Validation Guide] (http://guides.rubyonrails.org/active_record_validations.html) (che ho anche collegato nella mia risposta aggiornata) per maggiori informazioni sulle convalide. –

+0

Grazie! Questo è quello che stavo leggendo e stavo andando via quando ho iniziato a scrivere qualcosa di simile. Ma grazie ancora per aver fatto un passo così veloce e avere una risposta semplice. Molto apprezzato. – nulltek

Problemi correlati