2017-02-02 3 views
2

Ich habe Code, der einige Modelldaten in meinen before_validation Rückrufen aktualisiert/behebt.Wie kann ich Before_validations in Rails überspringen?

Allerdings möchte ich noch Validierungen durchführen können, um zu sehen, ob ein Modell in Ordnung ist wie es ist.

Genauer gesagt möchte ich wissen, ob ein Datensatz in der Datenbank gültig ist oder nicht. Ich würde also gerne in der Lage sein, einen Wert zu laden und .valid? zu fragen, ohne dass meine Callbacks laufen, die die Antwort beeinflussen würden.

Also habe ich versucht, diese (und ein paar Variationen), aber es hat nicht funktioniert:

skip_callback :validation, :before, unless: ->{self.changed?}

Die Dokumentation für skip_callback arm sind, so bin ich nicht sicher, ob ich es richtig bin mit . Kann dies zum Funktionieren gebracht werden?

Danke.

+1

Das Beispiel hier http://apidock.com/rails/ActiveSupport/Callbacks/ClassMethods/skip_callback sagt ': validate' nicht': validation', dass das Problem sein könnte? – Iceman

+0

@Iceman es ist ': Validierung'. Sie können alle 'Validierung' Callbacks finden mit dieser 'Model._validation_callbacks' –

Antwort

1

Nach APIDock skip_callback dauert callback_name, dann *filter_lists als Argumente (dann ein Block).

filter_list muss den Namen Ihrer Rückrufmethode enthalten. So wie unten.

class User < ActiveRecord::Base 
    validates_presence_of :name 
    before_validation :set_name 

    skip_callback :validation, :before, :set_name, unless: -> { self.changed? } 

    def set_name 
    self.name ||= 'foobar' 
    end 
end 

#<User:0x007ffcd7165248 id: 2, name: nil, created_at: Fri, 03 Feb 2017 01:10:37 UTC +00:00, updated_at: Fri, 03 Feb 2017 01:10:37 UTC +00:00> 

User.find(2).valid? # returns false 

user = User.find(2) 
user.updated_at = Time.now 
user.valid? # returns true, because it invokes :set_name before validation 
+0

Richtig, scheint es gibt keine Möglichkeit, alle before_validations zu vermeiden, oder referenzieren namenlose implementiert über Lambdas. Vielen Dank. – z5h

+0

@ z5h können Sie einfach alle auflisten –

Verwandte Themen