1

Ich mag würde eine bedingte benutzerdefinierte Validierung zu einem Modell hinzufügenRails 5: Hinzufügen bedingte benutzerdefinierte Validierungen

Rails ermöglicht Methoden zu schaffen, um zu erstellen benutzerdefinierte Validierungen

class Invoice < ApplicationRecord 
    validate :expiration_date_cannot_be_in_the_past 

    def expiration_date_cannot_be_in_the_past 
    if expiration_date.present? && expiration_date < Date.today 
     errors.add(:expiration_date, "can't be in the past") 
    end 
end 

Es ermöglicht auch bedingt zu erstellen Validierungen

class Order < ApplicationRecord 
    validates :card_number, presence: true, if: :paid_with_card? 

    def paid_with_card? 
    payment_type == "card" 
    end 
end 

Wie kann ich beides mischen?

Meine Vermutung etwas wie

validate :condition, if: :other_condition 

sein würde, aber das schafft eine Syntax:

syntax error, unexpected end-of-input, expecting keyword_end 

Antwort

3

Wenn Sie die fehlenden Schließung beheben end zu öffnen if in expiration_date_cannot_be_in_the_past, können Sie die folgenden haben ng arbeiten:

validate :expiration_date_cannot_be_in_the_past, if: :paid_with_card? 
2

Sie verfehlten Ende, korrigierte Code:

class Invoice < ApplicationRecord 
    validate :expiration_date_cannot_be_in_the_past 

    def expiration_date_cannot_be_in_the_past 
    if expiration_date.present? && expiration_date < Date.today 
     errors.add(:expiration_date, "can't be in the past") 
    end # this end you missed in code 
    end 
end 
2

Sie können jeden Validator verwenden. Dazu müssen Sie die folgenden Schritte:

  • Erstellen Sie einen Ordner validators in Ihrem app Verzeichnis mit dem Namen. Erstellen
  • eine Datei namens some_validator.rb
  • schreiben Codes wie:

    class SomeValidator < ActiveModel::EachValidator 
    def validate_each(object, attribute, value) 
        return unless value.present? 
        if some_condition1 
        object.errors[attribute] << 'error msg for condition1' 
        end 
        object.errors[attribute] << 'error msg 2' if condition2 
        object.errors[attribute] << 'error msg 3' if condition3 
        object.errors[attribute] << 'error msg 4' if condition4 
    end 
    

    Ende

  • bestätigt nun die von diesem benutzerdefinierten Validator, wie wie: validates :attribute_name, some: true

  • Stellen Sie sicher, geben auf dem Validator denselben Namen. Sie können die mehreren Bedingungen in diesem benutzerdefinierten Validierer schreiben.

Verwandte Themen