3

Ich bin neu bei Rails und ich stehe vor einem Problem. Ich habevalidates_inclusion_of Rails 3 mit einer Abfrage, die nicht wie erwartet funktioniert

Modelle

Model1 
id: integer 
account_id: integer 

Account 
id: integer 

ich im Model1 eine Validierung haben wie folgt,

Model Code:

validates :account_id, :inclusion => { :in => Account.find(:all).collect(&:id)} 

Ich benutze ein Drop-Down für Code anzeigen:

<%= f.select :account_id, @accounts.collect {|acc| [acc.name, acc.id]}, {:prompt => 'Select Account' }, { :selected => @defaultaccount, :class => 'selectwidth' } %> 

Ich verwende clientseitige Validierungen, um die Felder vor dem Senden des Formulars zu validieren. Ich verwende Heroku, um meine App bereitzustellen.

Ich erstelle zuerst einen Account und dann versuche ich aus dem Formular ein neues Model1 zu erstellen. Das Drop-Down-Menü enthält alle Accounts, die ich habe. Dann wähle ich ein Konto, das ich aus dem Dropdown erstellt habe, die clientseitigen Validierungen treten in Kraft und sagen "ist nicht gültig", was die Fehlermeldung für validates_inclusion_of ist, als ob das Konto niemals existiert. Nicht sicher, was ishappening und ich überprüfte die Datenbank und das Konto wird erstellt, weshalb das Dropdown-Konto mit Konten an erster Stelle geladen wird.

Ich ändere die validates_inclusion_of zu Rails 3 validiert: account_id,: inclusion => {: in => {}} Syntax und reploy. Jetzt versuche ich, dieses Konto in dem neuen model1-Formular auszuwählen. Die Dropdownliste zeigt keinen Fehler für das Konto an, das zuvor erstellt wurde.

Also dann habe ich ein neues Konto erstellt und versucht, ein neues Model1 für das neue Konto erstellen die Validierung Fehler wieder auftaucht.

Also ist es wie ein Cache-Problem? Ist es ein Client-seitiges Validierungs-Problem? Ich habe alles getan, um zu versuchen, die Probleme zu finden, aber ich habe keine Ideen, was passiert.

Also jedes Mal, wenn ich ein Konto erstelle, erwartet mich, dass ich deploy, was tötet, was die Anwendung tut. Wie werde ich dieses Problem los? Nicht wirklich sicher, was passiert.

Config, Rails 3 in Heroku Eingesetzte Asset-Pipeline

Gems verwendet: Client Side Validierungen Kaminari

Antwort

2

Es funktioniert nicht, wie Sie, weil die :in => Account.find(:all).collect(&:id) wollen sie nur ein einziges Mal im Produktionsmodus ausgewertet ist, wenn Rails die Lasten Klasse. Ich gestehe, dass ich den Grund für eine solche Validierung nicht verstehe. Wie auch immer, Sie müssen eine custom validator verwenden, wenn Sie das wirklich erreichen wollen.

+0

Ich habe nicht die ganze Logik der Validierungsabfrage nur der Einfachheit halber gegeben :) Nun danke für den Kopf über die Bewertung. – Baaju

+0

Ah OK. Das Bewertungsproblem mit Validierungen und Scopes ist etwas, das dich manchmal verrückt machen kann :) – lucapette

1

Derzeit ist die Anweisung ausgeführt wird, wenn der Server gestartet wird (wie Sie richtig realisiert) . Sie müssen es in ein Lambda umbrechen, damit es bei jeder Validierung ausgeführt wird.

1.8.7 Syntax:

validates :account_id, :inclusion => { :in => lambda {Account.find(:all).collect(&:id)}} 

1.9.2 Syntax:

validates :account_id, :inclusion => { :in => ->{Account.find(:all).collect(&:id)]} 
+0

Ja richtig.Ich habe vergessen zu erwähnen, dass es möglich ist, einen Proc oder eine Lamba zu verwenden. – lucapette

Verwandte Themen