0

Ich habe gehört zu und hat viele Beziehungen.Validiert Daten eines anderen Modells, wenn acces_nested_attributes_for verwendet wird

Das Problem ist, dass ich überprüfen muss, ob Score-Feld von verschachtelten Attributen ist weniger 0, sollte es nicht Datensätze speichern statt zurück zu Formular mit Fehlermeldung.

Der Code ich versuche ist:

class QuizAttempt < ActiveRecord::Base 

    has_many :quiz_answers 
    accepts_nested_attributes_for :quiz_answers, reject_if: :invalid_score 

    validate :score_greater_than_zero 

    private 

    def score_greater_than_zero 
    errors.add(:quiz_answers, 'must greater than 0') if invalid_score(attributes) 
    end 

    def invalid_score(attributes) 
    attributes['score'].to_i > 0 
    end 
end 


class QuizAnswer < ActiveRecord::Base 
    belongs_to :quiz_attempt 
end 

Das Formularfeld, wie die enthält Array aussieht:

name="quiz_attempt[quiz_answers_attributes][5][score]" 

Antwort

1

Ich brauche von verschachtelten Attributen wenn score Feld überprüfen weniger 0

Sie benötigen Zugriff auf geschachtelte Objekte (quiz_answers) und überprüfen ihre Attribute, nicht quiz_attempt ‚s Attribute:

def score_greater_than_zero 
    if quiz_answers.any? { |answer| answer.score <= 0 } 
     errors.add(:quiz_answers, 'must be greater than 0') 
    end 
    end 
+0

In diesem Fall ist der Grund für die Verwendung von' reject_if' ist auch grundlos? – LearningROR

+0

@LearningROR 'reject_if' ist etwas anderes, es wird das verschachtelte Objekt nur dann nicht speichern, wenn die Bedingung erfüllt ist, während die benutzerdefinierte Validierung einen Validierungsfehler auslöst und das Formular erneut ausgeben muss. Also das sind ein paar verschiedene Dinge –

+0

Fein, macht Sinn. Aber es scheint nicht für mich zu funktionieren. – LearningROR

Verwandte Themen