2012-05-08 3 views
4

Je veux valider la présence de ces 2 attributs :shipping_cost et :shipping_cost_anywhere si l'attribut :shipping est égal à true. et Sivalidates_presence_of si condition sur les rails 3.2 et mongoid + simple_form

J'ai dans mon modèle, mais ne fonctionne pas bien pour moi:

validates_presence_of :shipping_cost, :shipping_cost_anywhere, :allow_blank => "true" if :shipping == "true" 

ceci est mon: attribut expédition:

field :shipping, :type => Boolean, :default => "false" 

Comment puis-je faire?

Merci!

Édité.

J'utilise MongoId et pierres précieuses simple_form

+0

S'il vous plaît être plus précis sur comment cela ne fonctionne pas bien pour vous. Cela rend plus facile de deviner ce que vous essayez d'exprimer. :) – flooooo

+0

Merci, les champs ': shipping_cost' et': shipping_cost_anywhere' ne sont pas validés si je mets à true le champ ': shipping' – hyperrjas

Répondre

4

Le correctif pour moi à cette question est le code suivant:

validates :shipping_cost, :shipping_cost_anywhere, :presence => true, :if => :shipping? 

Merci à tous pour votre aide mais toute réponse a fonctionné pour moi. Merci!

0

Voici mon code de travail pour la méthode me.Call sur si la condition plutôt que de comparer

validates :prefix, :allow_blank => true, :uniqueness => { :case_sensitive => true } ,:if => :trunk_group_is_originating? 


     def trunk_group_is_originating? 
      if self.direction == "originating" 
      true 
      else 
      false 
      end 
     end 

espérons qu'il vous aidera .....

11
validates_presence_of :shipping_costs_anywhere, :if => :should_be_filled_in? 

def should_be_filled_in? 
    shipping_costs_anywhere == "value" 
end 

La méthode retournera vrai ou faux lorsqu'elle est appelée dans l'instruction. Pas besoin de mettre deux points en face de shipping_costs_anywhere.

+1

Je reçois avec cette méthode' méthode non définie should_be_filled_in? pour # ' – hyperrjas

+0

la méthode devrait être should_be_filled_in? plutôt que should_be_filled_in –

+0

Merci J'ai vérifié avec ceci mais cela ne fonctionne pas bien pour moi. Je vous remercie! – hyperrjas

1

Je ne peux pas tester, mais je pense que la syntaxe est plus comme:

validates_presence_of :shipping_cost, :shipping_cost_anywhere, :allow_blank => "true", :if => "shipping.nil?" 

Voir:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#conditional-validation

+0

Vous pouvez également définir une méthode comme les autres le suggèrent. Incidemment, j'ai également remarqué que le guide Rails mentionne que le validateur de présence ignore l'option: allow_blank, mais si cela fonctionne pour vous, je ne vais pas me disputer. –

+0

Merci mais ça ne marche pas très bien pour moi. – hyperrjas

+0

Ce n'est pas clair pour moi basé sur votre question et commenter plus tard si vous voulez valider quand l'expédition est vraie, ou quand c'est * pas * vrai. Pour valider lorsque l'expédition est vraie, utilisez ': unless'. Si vous voulez valider lorsque l'expédition est * not * true, utilisez ': if'. –

2

Le validates est maintenant préféré sur validates_presences_of etc. Comme mentionné hyperjas vous pouvez le faire:

validates :shipping_cost, 
    :shipping_cost_anywhere, 
    :presence => true, :if => :shipping? 

Cependant, ce conditionalizes la validation entière pour les :shipping_cost et :shipping_cost_anywhere. Pour une meilleure maintenabilité, je préfère une déclaration distincte validate pour chaque attribut. Plus important encore, vous rencontrerez probablement des situations où vous avez plusieurs validations avec des conditions différentes (comme une pour la présence et une autre pour la longueur, le format ou la valeur).Vous pouvez le faire comme ceci:

validates :shipping_cost, 
    presence: { if: :shipping? }, 
    numericality: { greater_than: 100, if: :heavy? } 

Vous pouvez également laisser les rails évaluer une corde de rubis.

validates :shipping_cost, 
    presence: { if: "shipping?" }, 
    numericality: { greater_than: 100, if: "shipping? and heavy?" } 

Et enfin, le cas échéant ajouter des messages personnalisés séparés:

validates :shipping_cost, 
    presence: { if: "shipping?", message: 'You forgot the shipping cost.' }, 
    numericality: { greater_than: 100, if: "shipping? and heavy?", message: 'Shipping heavy items is $100 minimum.' } 

Et ainsi de suite. J'espère que cela pourra aider.

Questions connexes