2009-10-28 3 views
0

J'ai une forme qui a un groupe de 3 text_fields. J'ai besoin de deux d'entre eux remplis pour faire des calculs. quantity doit toujours être rempli. Si price est vide, cost doit être rempli, ou vice versa.une entrée en fonction Validation de ce qui est entré dans une autre entrée - Rails

J'ai essayé, mais price est jamais nul, même si je laisse le champ vide. J'ai aussi essayé :price == nil et :price.blank?, mais ils font la même chose.

# app/models/item.rb 

validates_numericality_of :cost, :greater_than => 0 

if :price.nil? 
    validates_numericality_of :quantity, :greater_than => 0 
else 
    validates_numericality_of :price, :greater_than => 0 
end 

Répondre

2

Le code de la question tente de définir des méthodes de classe basées sur des variables d'instance. Il n'y a aucun moyen que cela fonctionne. Aussi: le prix n'est qu'un symbole. Il ne peut jamais avoir de valeur au-delà de sa valeur interne. Les résultats suivants dans les erreurs de syntaxe:

:price = nil 
:price = anything 

Les symboles sont toujours définis et ont une valeur interne, qui est définie sur le texte de la chaîne après « : ». Signification :price.nil? et :price == nil ne sera jamais vrai. Vous êtes confus parce que vous voyez: prix passé à d'autres méthodes de classe. Ce qui se passe réellement, c'est que ces méthodes prennent le symbole et se transforment dynamiquement en un nom de méthode d'instance à appeler, un nom de colonne lorsqu'il est exécuté, ou l'utilise simplement comme une clé dans un hachage.

Assez sur les raisons de ce que vous faisiez ne fonctionne pas. Parlons de la façon de le réparer.

Vous voulez utiliser les si et à moins que des clauses pour validations. Ce code fait exactement ce que vous voulez.

# app/models/item.rb 
validates_numericality_of :cost, :greater_than => 0 

    validates_numericality_of :quantity, :greater_than => 0, 
    :if => Proc.new {|item| item.price.nil?} 
    validates_numericality_of :price, :greater_than => 0, 
    :unless => Proc.new {|item| item.price.nil?} 
end 
+0

Ceci donne une erreur à '| item |'. – Ryan

+0

Désolé, cela aurait dû être Proc.new avant les blocs. Fixé maintenant – EmFi

+0

Merci, ça marche très bien. – Ryan

Questions connexes