Gibt es eine Möglichkeit zu überprüfen, die ein bestimmtes Attribut auf ein ActiveRecord-ohne Instanziierung ein Objekt zuerst?
Zum Beispiel, wenn ich einen Benutzer-Modell, und ich brauche, um zu validieren login nur (was passieren kann, wenn die Validierung eines Formulars per ajax), wäre es toll, wenn ich mit dem gleichen Modell-Validierungen Definition in der User-Modell, ohne tatsächlich zu instanziieren einer User-Instanz.
Also den controller würde ich in der Lage, code zu schreiben, wie
User.valid_attribute?(:login, "login value")
Ist es trotzdem kann ich dies tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit Validierungen operieren auf Instanzen (und Sie nutzen die Fehler-Attribut einer Instanz als container für Fehlermeldungen), können Sie Sie nicht benutzen, ohne das Objekt instanziiert. Having said, die, können Sie verstecken diese benötigte Verhalten in einer Methode der Klasse:
Nun, Sie können rufen Sie
so wie Sie soll.
(Im Idealfall würden Sie unter anderem, dass class-Methode direkt in den ActiveRecord::Base, so würde es vorhanden sein, um jedes Modell.)
return mock.errors.has_key?(attr)
definitiv seinreturn (not mock.errors.has_key?(attr))
. Andere, als dass die Antwort, die funktioniert.Danke Milan für deine Anregung. Davon inspiriert erstellte ich ein einfaches Modul kann man verwenden, um diese Funktionalität hinzuzufügen für jede Klasse. Beachten Sie, dass die ursprüngliche Milans Vorschlag hat ein Logik-Fehler Zeile:
sollte klar sein:
Getestet hab ich meine Lösung und es sollte funktionieren, aber ofc gebe ich keine Garantien. Und hier meine glorreiche Lösung. Im Grunde ein 2-liner, wenn Sie nehmen Sie das Modul Zeug.. Es akzeptiert Methodennamen als Stiche oder Symbole.
Verwenden Sie Ihre standard-Validierungs-Routinen:
Wenn das nicht für Sie arbeiten, erstellen Sie eine benutzerdefinierte Klasse Methode:
Ich hatte einen Teufel einer Zeit bekommen, diese Arbeit in Rails 3.1. Dies endlich funktionierte. (Nicht sicher, ob es der beste Weg, es zu tun, ich bin irgendwie ein newb.). Das problem, das ich hatte war, dass Wert wurde eingestellt, um Typ-ActiveSupport::SafeBuffer, und wurde nicht Validierung.
ActionController::Base.helpers.sanitize(params[:email])
im controller, bevor Sie ihn in das Modell. Aber dieerrors.messages.has_key?
noch Rails3 bestimmten.Ich habe mit der benutzerdefinierten Klasse Lösung, aber ich wollte nur, um sicherzustellen, dass es keinen besseren Weg,
und ich können es verwenden, wie
gültig, Fehler = ModelValidator.validate_attribute(Benutzer, "login", "humanzz")
Nur call User.valid_login?(login), um zu sehen, wenn die Anmeldung selbst ist gültig
Einer Umsetzung der "valid_attribute' Methode, die Sie vorschlagen:
Wie etwa:
Benutzer.columns_hash.has_key?('login')